2016-03-27 26 views
16

我试图反序列化一个ISO8601格式的日期到Java8即时使用杰克逊。我用ObjectMapper注册了JavaTimeModule,关闭了WRITE_DATES_AS_TIMESTAMPS。杰克森反序列化ISO8601 fromated日期时间到Java8即时

但是,如果有人试图反序列化2016-03-28T19:00:00.000 + 01:00,它将不起作用,因为JavaTimeModule似乎只会反序列化使用UTC时区偏移格式化的日期时间(例如2016-03 -28T18:00:00.000Z)。

@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "UTC") 

而像这样:然后我用@JsonFormat注解这样的尝试

@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。

有没有一种方法来反序列化ISO 8601字符串,该字符串不在UTC时区偏移到Java 8使用Jackson和JavaTimeModule实现即时编写而无需编写自定义反序列化程序?

+0

奇怪,我预计这个错误'无法解析日期值 '2016-03-28T19:00:00.000 + 01:00'(格式为:“YYYY-MM-dd'T 'HH:mm:ss.SSSZ“):无法解析的日期:”2016-03-28T19:00:00.000 + 01:00“'并且在尝试了您的代码之后,我在这两种情况下都遇到了这种错误。格式不匹配...您是否尝试过没有任何注释? –

+0

或使用此模式:yyyy-MM-dd'T'HH:mm:ss.SSSXXX(请参阅:https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html) –

+0

没有任何注释它的作品,但只有当偏移量指定为Z.它不适用于+0100或+01:00。我尝试了你的格式,我仍然得到Unsupported字段:YearOfEra异常,表明反序列化器的格式化程序没有配置时区(由于某些原因,即使偏移量在字符串中指定且Instant已完全定义,java 8 fromatter也需要TZ) 。 –

回答

0

“Z” 不工作的格式为 “+01:00”因为这是一种不同的模式。 JsonFormat使用SimpleDateFormat模式。 “Z”大写仅代表严格的RFC 822.您必须使用类似“+0100”的语法,而不使用冒号。

见:ISO 8601:2004SimpleDateFormat patterns