@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 也无济于事。
显然它真的想要像 2015-10-20T11:00:00Z 这样没有时区的 INSTANT 格式。这对于 OffsetDateTime 有点无用,因为重点是使用时区(或偏移量)。
有什么想法吗?
完全披露:我有一个 issue在他们的 Github 上打开。
请您参考如下方法:
这是一个偏移量缺少零的问题,即 8:30 而不是 08:30。显然 DateTimeFormatter#ISO_OFFSET_DATE_TIME 对此非常严格。我检查了所有 3 个 java.time.format.ResolverStyle 并且在缺少前导零时没有一个工作。您可能认为 ResolverStyle.LENIENT 或 ResolverStyle.SMART 会起作用,而 ResolverStyle.STRICT 可能会失败,但不会。
感谢 Jackson 开发团队的成员。




