Jackson JSR-310 模块无法反序列化最简单的 OffsetDateTime 格式
Jackson JSR-310 module fails to deserialize simplest OffsetDateTime format
@Test
public void testJacksonOffsetDateTimeDeserializer() throws IOException {
ObjectMapper mapper = new ObjectMapper().registerModule(new JavaTimeModule());
String json = "\"2015-10-20T11:00:00-8:30\"";
mapper.readValue(json, OffsetDateTime.class); // boom!
}
java.time.format.DateTimeParseException: Text '2015-10-20T11:00:00-8:30' could not be parsed at index 19
at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)
使用版本 2.6.3
即使我禁用 SerializationFeature.WRITE_DATES_AS_TIMESTAMPS
、DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE
并启用 SerializationFeature.WRITE_DATES_WITH_ZONE_ID
.
也无济于事
显然它真的想要 INSTANT 格式,如 2015-10-20T11:00:00Z,没有时区。这对于 OffsetDateTime 有点没用,因为重点是使用时区(或偏移量)。
有什么想法吗?
完全披露:我在他们的 Github 上打开了一个 issue。
这是一个偏移量缺少零的问题,即 8:30
而不是 08:30
。显然 DateTimeFormatter#ISO_OFFSET_DATE_TIME
对此非常严格。当缺少前导零时,我检查了使用所有 3 java.time.format.ResolverStyle
和 none 是否有效。您可能认为 ResolverStyle.LENIENT
或 ResolverStyle.SMART
会起作用,而 ResolverStyle.STRICT
可能会失败,但不会。
感谢 Jackson 开发团队的成员。
@Test
public void testJacksonOffsetDateTimeDeserializer() throws IOException {
ObjectMapper mapper = new ObjectMapper().registerModule(new JavaTimeModule());
String json = "\"2015-10-20T11:00:00-8:30\"";
mapper.readValue(json, OffsetDateTime.class); // boom!
}
java.time.format.DateTimeParseException: Text '2015-10-20T11:00:00-8:30' could not be parsed at index 19
at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)
使用版本 2.6.3
即使我禁用 SerializationFeature.WRITE_DATES_AS_TIMESTAMPS
、DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE
并启用 SerializationFeature.WRITE_DATES_WITH_ZONE_ID
.
显然它真的想要 INSTANT 格式,如 2015-10-20T11:00:00Z,没有时区。这对于 OffsetDateTime 有点没用,因为重点是使用时区(或偏移量)。
有什么想法吗?
完全披露:我在他们的 Github 上打开了一个 issue。
这是一个偏移量缺少零的问题,即 8:30
而不是 08:30
。显然 DateTimeFormatter#ISO_OFFSET_DATE_TIME
对此非常严格。当缺少前导零时,我检查了使用所有 3 java.time.format.ResolverStyle
和 none 是否有效。您可能认为 ResolverStyle.LENIENT
或 ResolverStyle.SMART
会起作用,而 ResolverStyle.STRICT
可能会失败,但不会。
感谢 Jackson 开发团队的成员。