【发布时间】:2016-07-15 03:14:03
【问题描述】:
我正在尝试使用 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 字符串反序列化为 Java 8 java.time.Instant 而无需编写自定义反序列化器?
【问题讨论】:
-
奇怪,我预计会出现此错误
Failed to parse Date value '2016-03-28T19:00:00.000+01:00' (format: "yyyy-MM-dd'T'HH:mm:ss.SSSZ"): Unparseable date: "2016-03-28T19:00:00.000+01:00",在尝试了您的代码后,我在这两种情况下都遇到了这种错误。格式不匹配...你试过没有任何注释吗? -
或使用此模式:yyyy-MM-dd'T'HH:mm:ss.SSSXXX(参见:docs.oracle.com/javase/7/docs/api/java/text/…)
-
在没有任何注释的情况下它可以工作,但前提是偏移量指定为 Z。它不适用于 +0100 或 +01:00。我尝试了您的格式,但仍然得到 Unsupported field: YearOfEra 异常,表明反序列化器的格式化程序未配置时区(出于某种原因,java 8 fromatter 需要 TZ,即使在字符串中指定了偏移量并且 Instant 已完全定义) .
-
您使用的是哪个版本的jackson / jackson-datatype-jsr310?
-
杰克逊 2.6.5 和杰克逊-datatype-jsr310 2.6.5
标签: java json datetime jackson java-8