Jackson 使用自定义日期格式错误地反序列化 Joda 日期

Posted

技术标签:

【中文标题】Jackson 使用自定义日期格式错误地反序列化 Joda 日期【英文标题】:Jackson incorrectly deserialize Joda dates with custom date format 【发布时间】:2016-02-18 18:48:54 【问题描述】:

我正在尝试使用自定义日期格式序列化和反序列化非常简单的对象:

public class DateTimeTest 
    private static final String DATE_PATTERN = "yyyyMMdd";

    public static DateTime date = DateTime.now();

    public static void main(String[] args) throws IOException 
        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new JodaModule());
        mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        ObjectWriter writer = mapper.writer();

        String str = writer.writeValueAsString(new Domain());
        System.out.println(str);

        ObjectReader reader = mapper.reader(Domain.class);
        Domain domain = reader.readValue(str);

        System.out.println(domain.getDate());
    

    private static class Domain 
        @JsonFormat(pattern = DATE_PATTERN)
        private DateTime date;

        public Domain() 
            this.date = DateTime.now();
        

        public DateTime getDate() 
            return date;
        

        public void setDate(DateTime date) 
            this.date = date;
        
    

在执行 main 方法时,我希望得到类似于:

“日期”:“20151117” 20151117

但不幸得到以下结果:

"date":"20151117"20151117-01-01T00:00:00.000+03:00(年份不正确

似乎 Jackson 忽略了对象反序列化的 @JsonFormat 注释,并将字符串视为 ISO-8601 表示法中的日期。有谁知道解决办法吗?

<jackson.version>2.5.4</jackson.version>
<jodatime.version>2.8.1</version>

更新:如果我将日期模式更改为“dd/MM/yyyy”,那么我什至会开始收到错误“IllegalArgumentException: Invalid format”。所以杰克逊肯定会忽略反序列化的日期模式。

【问题讨论】:

在下面看到您的答案,您的情况是否可以升级?或者您是否需要针对特定​​的 Jackson 版本进行修复? 是的,我终于升级了,代码按预期工作了。 【参考方案1】:

根据Jackson Release Notes,仅从 2.6.0 版本开始支持 Joda @JsonFormat(pattern=...) 进行反序列化。

【讨论】:

【参考方案2】:

您需要将形状添加到 JsonFormat

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DATE_PATTERN)

【讨论】:

不起作用 - 结果是一样的。 “20151117-01-01T00:00:00.000Z”而不是“2015-11-17”。 @DzmitryZahusta 将您的模式更改为此 yyyy-MM-dd 如果您有不同的日期对象,您可能还想查看 @Temporal 注释 我无法更改日期模式。它来自第三系统。我期待得到“20151117”日期字符串。【参考方案3】:

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss.SSSZ")

如果没有精确的模式格式,试试这个

http://wiki.fasterxml.com/JacksonFAQDateHandling

Set Jackson Timezone for Date deserialization

因为我不确定即使你保持甲酸巢穴也没有获得结果......通过上面的链接..它可能对你有帮助

【讨论】:

它对我不起作用,因为我需要的正是我写的日期格式 - “yyyyMMdd”。我期望 DateTime 将在双方正确地序列化和反序列化。【参考方案4】:

有什么问题?你得到了正确的序列化和解散。输出“20151117-01-01T00:00:00.000+03:00”只是 DateTime.toString() 的结果。

【讨论】:

以上是关于Jackson 使用自定义日期格式错误地反序列化 Joda 日期的主要内容,如果未能解决你的问题,请参考以下文章

Spring MVC for Rest 服务如何在 Jackson 反序列化错误时自定义错误“消息”?

使用 lombok @Builder 时通过 Jackson 反序列化“2021-09-24 00:00:00”日期格式

Jackson:为 Map 数据结构注册自定义 XML 序列化程序

Spring Boot 自定义Jackson ObjectMapper

一文详解JackSon配置信息

Jackson 将 ISO8601 格式的日期时间反序列化为 Java8 Instant