[alibaba/fastjson]当对象中存在LocalDateTime 类型时,序列化后的json会出现不同DateFormat结果

2025-11-11 673 views
0

问题复现代码如下 :

// 这个配置好像并不生效

        JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";

        TestBean test = new TestBean();

        LocalDateTime time1 = LocalDateTime.now();
        LocalDateTime time2 = LocalDateTime.parse("2017-09-22 15:08:56", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        test.setTime1(time1);
        test.setTime2(time2);

        String json = JSON.toJSONString(test, SerializerFeature.WriteDateUseDateFormat);
        System.out.println(json);

output : {"time1":"2017-09-22T15:19:53.359","time2":"2017-09-22 15:08:56"}

输出的jsonString 会出现不同的格式。 这使的我在反序列化时出现困扰,需要为不同的格式制定不同的DateTimeFormatter. 目前只知道 jsonString 直接反序列化为对象时,是没有问题的,LocalDateTime 类型的字段会被正确赋值。 但是很多时候只是想取出jsonString 中的某个String 进行解析处理。我想知道这是否是一个BUG。

下面是我使用的版本

com.alibaba fastjson 1.2.17

回答

1
String json = JSON.toJSONStringWithDateFormat(
                                  test, 
                                  "yyyy-MM-dd HH:mm:ss", 
                                  SerializerFeature.WriteDateUseDateFormat);

这样用吧

3

JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";

@organics2016 这个配置本来就不会起作用,因为代码里本来的值就是这个。

5

看了一下代码,localDateTime有个诡异的设计: 1、如果直接通过参数指定了format,以此为准 2、如果没有显式指定,判断localDateTime里nano是否为0, 2.1、如果为0,使用JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss"; 2.2、如果不为0,使用object.toString();

上面的例子里,now是带nano的,所以用了2.2,parse出来的不带所以用了2.1

4

在不改变现有所有逻辑的情况下,可以加个DEFFAULT_LOCAL_DATE_TIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS";来处理。

我现在PR。

4
1507

现在 1、可以通过修改DEFFAULT_LOCAL_DATE_TIME_FORMAT来改变nano不为0的格式, 2、可以通过修改DEFFAULT_DATE_FORMAT来改变nano为0的格式,