[alibaba/fastjson]格式为yyyy-MM-dd hh:mm:ss.SSS的日期反序列化失败案例

2025-11-03 19 views
0

直接上反例: Date date = JSON.parseObject("\"0100-01-27 11:22:00.000\"", Date.class); 运行上面这行代码会报错,错误信息如下:

Caused by: java.lang.NumberFormatException: For input string: "0100-01-27 11:22:00.000" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.lang.Long.parseLong(Long.java:589) at java.lang.Long.parseLong(Long.java:631) at com.alibaba.fastjson.serializer.DateCodec.cast(DateCodec.java:244) at com.alibaba.fastjson.parser.deserializer.AbstractDateDeserializer.deserialze(AbstractDateDeserializer.java:138) at com.alibaba.fastjson.parser.deserializer.AbstractDateDeserializer.deserialze(AbstractDateDeserializer.java:15) at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:661)

但是,将年份改成大于等于1000或者去掉秒后面的毫秒数,可以成功反序列化,如: Date date = JSON.parseObject("\"1000-01-27 11:22:00.000\"", Date.class); Date date = JSON.parseObject("\"0100-01-27 11:22:00\"", Date.class);

对于格式为yyyy-MM-dd hh:mm:ss.SSS的日期, 如果年份小于1000,为什么会反序列化失败呢? 劳烦帮忙解答,提前感谢!

目前有个临时的解决方案: 覆盖com.alibaba.fastjson.parser.deserializer.AbstractDateDeserializer中的cast方法,使用SimpleDateFormat来parse字符串。

如果有更合适的解决办法,欢迎留言。

回答

8

看了下源码,修改全局变量JSON.DEFFAULT_DATE_FORMAT也是可行的。 JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd hh:mm:ss.SSS";

还没找到“年份小于1000失败”的原因,继续看源码......

5

为什么有这样的需求?

5

@wenshao,感谢回复! 公司是做金融数据处理,数据分析员不懂技术,有时候他们会对数据处理软件进行一些手动测试,比如随便输入一条股票数据(其中包含日期),看看处理结果。因为日期是数据分析员随机输入的,而且范围是0001/01/01到9999/12/31,所以才会出现上述这么奇葩的日期。这样的数据不会被当作真实的数据保存在主数据库中,但是在后台处理过程中需要被序列化和反序列化,所以才有上述的需求。

2

最新版本1.2.59无该问题