【问题标题】:Jackson JSR-310 module fails to deserialize simplest OffsetDateTime formatJackson JSR-310 模块无法反序列化最简单的 OffsetDateTime 格式
【发布时间】:2015-10-20 10:29:20
【问题描述】:
@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 也无济于事。

显然它真的想要像 2015-10-20T11:00:00Z 这样的 INSTANT 格式,没有时区。这对于 OffsetDateTime 有点没用,因为重点是使用时区(或偏移量)。

有什么想法吗?

完全披露:我在他们的 Github 上打开了一个 issue

【问题讨论】:

    标签: json datetime jackson java-8 deserialization


    【解决方案1】:

    这是一个偏移量缺失零的问题,即8:30 而不是08:30。显然DateTimeFormatter#ISO_OFFSET_DATE_TIME 对此非常严格。我检查了所有 3 个 java.time.format.ResolverStyle 并且当缺少前导零时没有一个工作。你会认为ResolverStyle.LENIENTResolverStyle.SMART 会起作用,而ResolverStyle.STRICT 可能会失败,但不会。

    感谢 Jackson 开发团队的人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-14
      • 2020-02-29
      • 1970-01-01
      • 2015-06-16
      • 1970-01-01
      • 2018-11-14
      • 1970-01-01
      相关资源
      最近更新 更多