首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >杰克逊将ISO8601格式的日期时间反序列化为Java8 Instant

杰克逊将ISO8601格式的日期时间反序列化为Java8 Instant
EN

Stack Overflow用户
提问于 2016-03-28 04:55:59
回答 3查看 81.2K关注 0票数 57

我正在尝试使用Jackson将ISO8601格式的日期反序列化为Java8 java.time.Instant。我在ObjectMapper中注册了JavaTimeModule,并关闭了WRITE_DATES_AS_TIMESTAMPS设置。

但是,如果试图反序列化2016-03-28T19:00:00.000+01:00将不会起作用,因为JavaTimeModule似乎只会反序列化使用UTC时区偏移(例如2016-03-28T18:00:00.000Z)格式化的日期-时间。然后我尝试使用@JsonFormat注释,如下所示:

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

就像这样:

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

但是,这两种方法都不起作用,我得到了一个异常:

com.fasterxml.jackson.databind.JsonMappingException: Unsupported field: YearOfEra (through reference chain: org.example.Article["date"])

这意味着时区参数被忽略,日期时间格式化程序不知道如何在没有时区的情况下格式化Instant。

有没有一种方法可以使用Jackson和JavaTimeModule将不在UTC时区偏移量中的ISO8601字符串反序列化为Java8 java.time.Instant,而无需编写自定义的反序列化程序?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-28 06:49:19

您需要在modell类中通过XXX设置显式时区:

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

(请参阅:https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html)

票数 62
EN

Stack Overflow用户

发布于 2019-02-13 00:26:02

在Jackson 2.9.8 (我写这篇文章时的当前版本)中,最好使用Instant而不是Date。

您必须添加一个依赖项:

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.9.8</version>
</dependency> 

另外,注册模块并将SerializationFeature.WRITE_DATES_AS_TIMESTAMPS配置为false。

new ObjectMapper()
                .findAndRegisterModules()
                .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

欲了解有关杰克逊Java8的更多信息,请访问:https://github.com/FasterXML/jackson-modules-java8

票数 11
EN

Stack Overflow用户

发布于 2020-08-06 03:45:59

Jackson可以全局(不带注释)配置为接受带冒号或不带冒号的时间戳:

ObjectMapper mapper = new ObjectMapper();
mapper.setDateFormat(new StdDateFormat().withColonInTimeZone(true));

默认的Jackson时区格式从2.11版开始从'+0000‘更改为'+00:00’。根据ISO-8601,这两种格式都有效。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36252556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档