我正在尝试使用 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
?
原文由 Krešimir Nesek 发布,翻译遵循 CC BY-SA 4.0 许可协议
您需要在模型类中通过
XXX
设置明确的时区:(参见: https ://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html)