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

news/2024/5/19 6:23:15/文章来源:https://blog.csdn.net/lrb0677/article/details/128999685

这篇文章主要记录升级到 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 {@Overridepublic 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 {@Overridepublic 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 方法,如下图

    @Overridepublic 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());}}

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_257051.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于springboot+vue的宠物商城系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

新能源汽车PK燃油汽车,首次胜出,输赢真的那么重要?

新能源汽车PK燃油汽车&#xff0c;输赢真的那么重要&#xff1f;是的。【科技明说 &#xff5c; 每日看点】今天看到一个新能源汽车领域的消息&#xff0c;我觉得很有意思&#xff0c;是说中国新能源汽车满意度水平首次超过了燃油汽车&#xff0c;你们觉得是这样么&#xff1f;…

ubuntu部署quark-5

下载源代码 解压zip sudo apt-get install unzip unzip xxxxx.zip安装所需要的包 sudo apt install python2 # 查看是否配置了默认的python sudo update-alternatives --list python若没有设置&#xff0c;会显示&#xff1a; # update-alternatives: error: no alterna…

Netty零拷贝机制

Netty零拷贝机制一&#xff1a;用户空间与内核空间二&#xff1a;传统IO流程三&#xff1a;零拷贝常见的实现方式1. mmap write2. sendfile四&#xff1a;Java中零拷贝五&#xff1a;Netty 中如何实现零拷贝1. CompositeByteBuf 实现零拷贝2. wrap 实现零拷贝3. slice 实现零拷…

CSP-《I‘m stuck!》-感悟

题目 做题过程 注&#xff1a;黄色高亮表示需要注意的地方&#xff0c;蓝色粗体表示代码思路 好久没有写过代码了&#xff0c;今天做这道编程题&#xff0c;简直是灾难现场。 上午编程完后发现样例没有通过&#xff0c;检查发现算法思路出现了问题&#xff1a;我计数了S不能到…

神经网络基础知识

神经网络基础知识 文章目录神经网络基础知识一、人工神经网络1.激活函数sigmod函数Tanh函数Leaky Relu函数分析2.过拟合和欠拟合二、学习与感知机1.损失函数与代价函数2. 线性回归和逻辑回归3. 监督学习与无监督学习三、优化1.梯度下降法2.随机梯度下降法(SGD)3. 批量梯度下降法…

Leetcode.1138 字母板上的路径

题目链接 Leetcode.1138 字母板上的路径 Rating &#xff1a; 1411 题目描述 我们从一块字母板上的位置 (0, 0)出发&#xff0c;该坐标对应的字符为 board[0][0]。 在本题里&#xff0c;字母板为board ["abcde", "fghij", "klmno", "pqr…

第02章_MySQL环境搭建

第02章_MySQL环境搭建 讲师&#xff1a;尚硅谷 宋红康&#xff08;江湖人称&#xff1a;康师傅&#xff09; 官网&#xff1a;http://www.atguigu.com 1. MySQL的卸载 1.1 步骤1&#xff1a;停止MySQL服务 在卸载之前&#xff0c;先停止MySQL8.0的服务。按键盘上的“Ctrl …

应对新的挑战!ChatGPT将如何改变多域作战?

​公众号博主推送内容&#xff0c;未经许可&#xff0c;不得转载或者引用。 原文&#xff1a;Exploring the Possibilities of ChatGPT in Rugged Military AI Applications 《ChatGPT&#xff1a;利用最先进的技术支撑多域作战》 ChatGPT是一款基于GPT-3大型自然语言模型的…

JVM学习02:内存结构

JVM学习02&#xff1a;内存结构 1. 程序计数器 1.1、定义 Program Counter Register 程序计数器&#xff08;寄存器&#xff09; 作用&#xff1a;是记住下一条jvm指令的执行地址 特点&#xff1a; 是线程私有的不会存在内存溢出 1.2、作用 程序计数器物理上是由寄存器来实…

rar压缩文件暴力破解

1. 简介 rar 压缩文件资源又不少是被加密的&#xff0c;密码通常也比较简单&#xff0c;我们可以通过暴力破解的方式来获取&#xff0c;通常耗时也比较小 程序地址&#xff1a;rar压缩密码暴力破解程序 2. 使用说明 2.1 基本语法 rar-bruteforce-crack.py [--start START] …

RocketMQ5.0.0消息存储<三>_消息转发与恢复机制

目录 一、消息转发 1. ReputMessageService线程初始化 2. 消息转发更新ConsumeQueue 3. 消息转发更新IndexFile 二、恢复机制 1. Broker加载存储文件 2. Broker正常退出的文件恢复 3. Broker异常退出的文件恢复 三、参考资料 一、消息转发 消息消费队列文件、索引文件…

DNS 原理入门指南(一)

DNS 是互联网核心协议之一。不管是上网浏览&#xff0c;还是编程开发&#xff0c;都需要了解一点它的知识。 本文详细介绍DNS的原理&#xff0c;以及如何运用工具软件观察它的运作。我的目标是&#xff0c;读完此文后&#xff0c;你就能完全理解DNS。 一、DNS 是什么&#xff1…

Java中导入、导出Excel——HSSFWorkbook 使用

一、介绍 当前B/S模式已成为应用开发的主流&#xff0c;而在企业办公系统中&#xff0c;常常有客户这样子要求&#xff1a;你要把我们的报表直接用Excel打开(电信系统、银行系统)。或者是&#xff1a;我们已经习惯用Excel打印。这样在我们实际的开发中&#xff0c;很多时候需要…

字母板上的路径 题解,力扣官方出来挨打(小声)

字母板上的路径 我们从一块字母板上的位置 (0, 0) 出发&#xff0c;该坐标对应的字符为 board[0][0]。 在本题里&#xff0c;字母板为board [“abcde”, “fghij”, “klmno”, “pqrst”, “uvwxy”, “z”]&#xff0c;如下所示。 我们可以按下面的指令规则行动&#xff1a…

Python:路径之谜(DFS剪枝)

题目描述 小张冒充 X 星球的骑士&#xff0c;进入了一个奇怪的城堡。 城堡里边什么都没有&#xff0c;只有方形石头铺成的地面。 假设城堡地面是 nn 个方格。如下图所示。 按习俗&#xff0c;骑士要从西北角走到东南角。可以横向或纵向移动&#xff0c;但不能斜着走&#xf…

【微信小游戏开发笔记】第二节:Cocos开发界面常用功能简介

Cocos开发界面常用功能简介 本章只介绍微信小游戏开发时常用的功能&#xff0c;其他功能不常用&#xff0c;写多了记不住&#xff08;其实是懒 -_-!&#xff09;&#xff1a; 层级管理器&#xff0c;用于操作各个节点。资源管理器&#xff0c;用于操作各种文件资源。场景编辑…

C/C++工业数据分析与文件信息管理系统[2023-02-12]

C/C工业数据分析与文件信息管理系统[2023-02-12] 程序设计基础A课程设计 工业数据分析与文件信息管理系统 题目背景 智能制造是以工业生产数据分析、自动化技术为基础&#xff0c;具有信息深度自感知、智慧优化自决策、精准控制自执行等功能&#xff0c;使制造活动达到安全…

sg3_utils arm64 静态编译

需求背景 在进行ufs等scsi device测试时&#xff0c;需要进行power mode切换等测试&#xff0c;因此需要有一个简单地工具集来向scsi device&#xff08;ufs接口&#xff09;发送scsi命令&#xff0c;比如 scsi reset命令等。在网上调研后发现sg3_utils是一个比较全面的工具。…

使用Python,Opencv检测图像,视频中的猫

使用Python&#xff0c;Opencv检测图像&#xff0c;视频中的猫&#x1f431; 这篇博客将介绍如何使用Python&#xff0c;OpenCV库附带的默认Haar级联检测器来检测图像中的猫。同样的技术也可以应用于视频流。这些哈尔级联由约瑟夫豪斯&#xff08;Joseph Howse&#xff09;训练…