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_TIMESTAMPSDeserializationFeature.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.LENIENTResolverStyle.SMART 会起作用,而 ResolverStyle.STRICT 可能会失败,但不会。

感谢 Jackson 开发团队的成员。