这篇文章主要记录升级到 fastjson2.x 版本后出现的一些问题
1. jar 包引入问题
问题描述:从 2.x 版本后,fastjson 貌似开始对代码模块进行了拆分,所以在调整配置的时候,会发现有些类突然没了,其实是需要引入其他的扩展包。
从 2.0.22 版本开始,需要引入下面三个 jar 包
    <dependency>
      <groupId>com.alibaba.fastjson2</groupId>
      <artifactId>fastjson2</artifactId>
    </dependency>
    <dependency>
      <groupId>com.alibaba.fastjson2</groupId>
      <artifactId>fastjson2-extension</artifactId>
    </dependency>
    <dependency>
      <groupId>com.alibaba.fastjson2</groupId>
      <artifactId>fastjson2-extension-spring5</artifactId>
    </dependency> 
起初的 2.x 版本,只需要引入前两个 jar 包,后面想更新一下新版本,好家伙,又分出来一个 fastjson2-extension-spring5,其实就是将 spring 的一些相关的配置类独立出来了。

用的最多应该是 redis 的序列化类,还有 http 的消息解析器。
2. 自定义序列化 ObjectWriter 类的 writeXXX 方法问题
问题描述:1.x 版本中 SerializeWriter 的 write 方法,在 2.x 版本中 ObjectWriter 并没有提供,反而提供很多不同的 writeXXX 方法,匹配不同的返回类型,如 writeString 方法,就会返回一个字符类型。
之前系统使用 1.2.83 版本,写了一个 LocalDateTime 序列化为时间戳毫秒数的自定义序列化类,使用的是 SerializeWriter 的 write 方法。
public class DateJsonSerializer implements ObjectSerializer {
    @Override
    public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {
        SerializeWriter out = serializer.getWriter();
        if (object == null) {
            serializer.getWriter().writeNull();
            return;
        }
        if (object instanceof LocalDateTime) {
            LocalDateTime localDateTime = (LocalDateTime) object;
            out.write(localDateTime.toInstant(ZoneOffset.of("+8")).toEpochMilli() + "");
        }
    }
} 
控制器测试代码如下
    @GetMapping("/test")
    public DemoTestResponse test() {
        DemoTestResponse response = new DemoTestResponse();
        response.setDateTime(LocalDateTime.now());
        return response;
    } 
返回对象如下
@Data
public class DemoTestResponse {
    @JSONField(name = "date_time", serializeUsing = DateJsonSerializer.class)
    private LocalDateTime dateTime;
} 
postman 运行后结果如下,可以看到自定义序列化生效了,并且返回了数字型的时间戳。

升级到 2.x 版本后,重写了这个自定义序列化类,如下
public class DateJsonSerializer implements ObjectWriter {
    @Override
    public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type fieldType, long features) {
        if (object == null) {
            jsonWriter.writeNull();
            return;
        }
        if (object instanceof LocalDateTime) {
            LocalDateTime localDateTime = (LocalDateTime) object;
            jsonWriter.writeString(localDateTime.toInstant(ZoneOffset.of("+8")).toEpochMilli()+"");
        }
    }
} 
这里使用了 JSONWriter 的 writeString 方法,这也是问题所在,还是运行上面的方法,返回结果如下,变为了一个字符串了。

因为当时没留意,所以就以为 writeString 的意思是参数为字符串类型就用了。其实 JSONWriter 类提供了很多的 writeXXX 方法。
这里我们应该使用 writeMillis 方法,如下图
    @Override
    public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type fieldType, long features) {
        if (object == null) {
            jsonWriter.writeNull();
            return;
        }
        if (object instanceof LocalDateTime) {
            LocalDateTime localDateTime = (LocalDateTime) object;
            jsonWriter.writeMillis(localDateTime.toInstant(ZoneOffset.of("+8")).toEpochMilli());
        }
    } 
运行结果如下,问题解决。







![[MySQL教程②] - MySQL介绍和发展史](https://img-blog.csdnimg.cn/img_convert/cfd671ea384c882876037805e9673e57.png)




![[全栈工程师]从0到封神](https://img-blog.csdnimg.cn/4430451040574a9f9a111904372be42b.png)







