2016-03-27 29 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