我正在尝试使用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
,而无需编写自定义的反序列化程序?
发布于 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)
发布于 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
发布于 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,这两种格式都有效。
https://stackoverflow.com/questions/36252556
复制相似问题