【fastjson2.x 记录】那些从1.x升级到2.x踩过的坑

这篇具有很好参考价值的文章主要介绍了【fastjson2.x 记录】那些从1.x升级到2.x踩过的坑。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这篇文章主要记录升级到 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 的一些相关的配置类独立出来了。

fastjson版本升级问题,springboot进阶应用,java,开发语言

 用的最多应该是 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 运行后结果如下,可以看到自定义序列化生效了,并且返回了数字型的时间戳。

fastjson版本升级问题,springboot进阶应用,java,开发语言

 升级到 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 方法,这也是问题所在,还是运行上面的方法,返回结果如下,变为了一个字符串了。

fastjson版本升级问题,springboot进阶应用,java,开发语言

因为当时没留意,所以就以为 writeString 的意思是参数为字符串类型就用了。其实 JSONWriter 类提供了很多的 writeXXX 方法。fastjson版本升级问题,springboot进阶应用,java,开发语言

 这里我们应该使用 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());
        }
    }

运行结果如下,问题解决。 

fastjson版本升级问题,springboot进阶应用,java,开发语言

3. JSONField 注解智能匹配失效

问题描述:在使用 1.x 版本时,字段使用的@JSONField(name = "openid"),前端传过来的字段名为 open_id,接口能正常运行。但是升级到 2.x 版本时,就为空值。

这是一个隐藏很深的bug,估计是当时开发接口的时候也没有注意,接口已能够正常运行。但是升级到 2.x 版本时,就出问题了。

其实这得益于 fastjson 的智能匹配,忽略了大小写和下划线,依然将 json 映射成功。但是在 2.x 版本后,貌似智能匹配并没有默认开启,所以就出现映射不成功的情况。

笔者尝试使用 开启智能匹配,但是没有成功,原因未明,先记录下来,后面有时间去看一下源码。从官网的 Issues 来看,也有不少这种序列化和反序列化的问题,先版本的更新也针对这种情况的比较多。

请求接收的 bean 如下,使用 JSONReader.Feature.SupportSmartMatch ,依旧是使用 openid 这个字段名称。

@Data
public class XcUserEquityRequest {


    @JSONField(name = "app_id")
    private String appId;


    @JSONField(name = "openid", deserializeFeatures= JSONReader.Feature.SupportSmartMatch)
    private String openId;
}

请求的时候,依旧使用 open_id 下划线的形式。

fastjson版本升级问题,springboot进阶应用,java,开发语言

 但是接口映射的openid字段为空。

fastjson版本升级问题,springboot进阶应用,java,开发语言

官方对 SupportSmartMatch 的说明如下,

fastjson版本升级问题,springboot进阶应用,java,开发语言文章来源地址https://www.toymoban.com/news/detail-642036.html

到了这里,关于【fastjson2.x 记录】那些从1.x升级到2.x踩过的坑的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 扫码跳转小程序终极方案,详细记录踩过的坑!不信进来看!扫描普通二维码进入小程序功能记录(两种方式)

    小程序管理平台 :https://mp.weixin.qq.com/ 选择 :开发管理-开发设置-扫普通链接二维码打开小程序 校验文件 点击添加进入配置页面 !!!还有一个校验文件,这个必须扔到服务器上面,放在域名下根目录即可,只要在二维码规则下的地址可以访问到即可 放在域名下根目录即可

    2024年02月13日
    浏览(31)
  • MongoDB踩过的坑

    目录 ‘mongodump‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件 备份数据库 启动MongoDB服务 可视化工具:MongoDB Compass 由于目标计算机积极拒绝,无法连接  BSONObj size: xxxx is invalid. Size must be between 0 and 16793600 (16MB) mongodb默认时没有mogodump.exe工具和mongorestore.exe工具

    2024年02月16日
    浏览(37)
  • 安装whisper模块踩过的坑

    如果你和我一样,通过以下命令安装whisper 但却出现了 fatal: unable to access \\\'https://github.com/openai/whisper.git/\\\': OpenSSL SSL_read: Connection was reset, errno 10054 那么只需要 在运行 pip install 之前在运行以下的命令,再次重新 pip install ... 即可 原因: 安装whisper需要先安装rust环境依赖。 官方在

    2024年02月15日
    浏览(36)
  • docker+selenium+firefox | 我踩过的坑

    为了实现SSPUBot不在我电脑上部署,我只能将其制成Docker。 要知道SSPUBot在开发的时候用了selenium+Firefox的想法开发,所以Docker里面必须要有Firefox,结果这就让见识到了最顽固的错误 selenium.common.exceptions.WebDriverException: Message: Process unexpectedly closed with status 255 我们还是省略我找的

    2024年01月22日
    浏览(46)
  • 关于python的mediapipe库踩过的坑

      大家好,我是csdn的博主: lqj_本人 这是我的个人博客主页: lqj_本人的博客_CSDN博客-微信小程序,前端,vue领域博主 lqj_本人擅长微信小程序,前端,vue,等方面的知识 https://blog.csdn.net/lbcyllqj?spm=1000.2115.3001.5343 哔哩哔哩欢迎关注: 小淼前端 小淼前端的个人空间_哔哩哔哩_bilibil

    2024年01月17日
    浏览(30)
  • 一卡通水控电控开发踩过的坑

    最近在做一个项目,是对接一卡通设备的。我一开始只拿到设备和3个文档开局。不知道从哪下手。一步一步踩坑过来。踩了很多没有必要的坑,写出来给有用的人吧。 有个读卡器,一开始什么软件也不提供。我都不知道是干嘛用的。后来问客服才知道有一个测试软件。我真

    2024年01月23日
    浏览(46)
  • hql(hive sql)中的join及踩过的坑

    1 几种join方式 join join 对应于 inner join 内连接。 当多张表进行 join 的时候,所有表中与 on 条件中匹配的数据才会显示。 hql (即 hive sql )的 on 子句中只支持 and ,不支持 or ,也不支持 null 的对比。 left outer join 左外连接,也称为左连接。 以左表为基准,如果右表有条件匹配

    2024年01月21日
    浏览(34)
  • 嵌入式-stm32重要基础知识(及踩过的坑)

    1、固件库: 固件库就是函数的集合,固件库函数的作用是向下负责与寄存器直接打交道, 向上提供用户函数调用的接口(API)。 2、CMSIS标准与固件库的关系 就是对固件库函数的要求。 ARM 公司为了能让不同的芯片公司生产的 Cortex-M3 芯片能在软件上基本兼容,和芯片生产商

    2024年02月04日
    浏览(42)
  • 微信小程序哪些wifi+tcp+udp踩过的坑

    1、wx.startWifi 开启wifi模块 2、如果需要展示wifi列表则调用 wx.getWifiList(Object object) 注意: 请求获取 Wi-Fi 列表。wifiList 数据会在 onGetWifiList 注册的回调中返回。 Android 调用前需要 用户授权 scope.userLocation。 iOS 上将跳转到系统设置中的微信设置页,需要用户手动进入「无线局域网

    2024年02月15日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包