jackson使用setDateFormat后反序列化错误

最近marketing-activity系统在接入降级服务,出现启动时可以正确获取到降级配置,系统运行一段时间后修改降级策略不生效的问题,之前订单系统,用户系统和其他系统的接入都没问题出现这个问题,肯定是触发了某种特定的case。营销的同学联系我进行排查,排查日志发现是降级服务反序列化Date类型异常,接收到的数据格式是yyyy-MM-dd HH:mm:ss,并不在jackson支持的反序列化格式之内。降级服务的sdk也是使用的jackson进行序列化的,为什么会出现jackson序列化后的数据却不能使用jackson反序列化。
接着查看marketing-activity系统的降级服务sdk日志发现一个很诡异的现象,最初发送的序列化后的请求还是时间戳格式的,运行一段时间后就变成了yyyy-MM-dd HH:mm:ss格式,也就是说系统的行为在运行时被改变了。

那么到底是什么可以改变系统运行时的序列化逻辑呢?可能出现的主要原因有2种。一种是字节码技术,也就是btrace,greys这些。另一种就是调用jackson本身的api改变了一些属性。显然第二种的可能性更大一些,果然在jsonUitl里发现了蛛丝马迹,toObject允许设置特定的时间格式进行反序列化,调用setDateFormat会导致后续全部的Date类型的序列化都会是yyyy-MM-dd HH:mm:ss格式,自然不能默认设置的jackson反序列化。
jsonutil.png

至此降级服务改变策略后不生效的根本原因就得到了解答,那么如果某个对象就是要使用yyyy-MM-dd HH:mm:ss 进行序列化和反序列化怎么办,建议使用@JsonFormat 单独对属性进行注释。
最后谈谈fastjson和jackson,貌似jackson的各种坑遇到过很多,而fastjson的坑很少,那么为什么jackson还是要比fastjson更流行,真的只是国外的月亮更圆,空气更甜?这个主要是json框架的设计理念偏重点不同,fastjson偏重的是简单和快速,内部实现有很多的hack和magic code。而jackson偏重的是标准和强大,格式支持json,xml,有很多的属性可以设置非常的灵活,也有很多的接口可以自定义进行扩展,导致学习成本比较高,需要详细看过jackson文档才能上手。

转载于:https://www.cnblogs.com/minotaursu/p/8085935.html

Jackson 可以很方便地将时间戳反序列化成 Java Date 对象。要实现这个功能,你可以按照以下步骤进行: 1. 在 Java 类中定义一个包含日期时间字段的 POJO。例如: ```java public class MyObject { private String name; private Date createTime; // 省略 getter 和 setter 方法 } ``` 2. 在 JSON 字符串中,使用 Unix 时间戳来表示日期时间字段的值。例如: ```json { "name": "my object", "createTime": 1661846400000 } ``` 在这个例子中,1661846400000 是一个 Unix 时间戳,它表示 2022 年 9 月 29 日凌晨 00:00:00 所对应的毫秒数。 3. 使用 Jackson 的 ObjectMapper 对象进行反序列化,并指定日期时间格式。例如: ```java ObjectMapper mapper = new ObjectMapper(); mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); MyObject obj = mapper.readValue(jsonString, MyObject.class); ``` 在这个例子中,我们先调用了 ObjectMapper 的 configure 方法,将 WRITE_DATES_AS_TIMESTAMPS 属性设置为 false,这样 Jackson 就会将 Unix 时间戳反序列化Date 对象。然后,我们调用了 setDateFormat 方法,指定了日期时间格式。这样,Jackson 就会根据指定的日期时间格式将日期时间字段转换成 Date 对象。 注意,如果 JSON 字符串中的日期时间格式不是标准格式,你需要在 setDateFormat 方法中指定正确的格式。如果你没有指定日期时间格式,Jackson使用默认格式来解析日期时间值。默认格式为 ISO-8601 格式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值