2016-03-27 25 views
16

Ich versuche, ein ISO8601-formatiertes Datum in Java8 Instant zu deserialisieren mit Jackson. Ich habe JavaTimeModule mit dem ObjectMapper registriert und WRITE_DATES_AS_TIMESTAMPS deaktiviert.Jackson deserialize ISO8601 aus dem Datum-Zeit in Java8 Instant

Wenn man versucht, 2016-03-28T19: 00: 00.000 + 01: 00 deserialize, wird es nicht funktionieren, weil es scheint, dass JavaTimeModule nur Datum-formatiert mit UTC-Zeitzone Offset formatiert (zB 2016-03 -28T18: 00: 00.000Z). Ich habe dann versucht @JsonFormat Anmerkung wie folgt aus:

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

Und wie folgt aus:

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

jedoch keiner dieser Arbeit, und ich erhalte eine Ausnahme:

com.fasterxml.jackson.databind.JsonMappingException: Unsupported field: YearOfEra (through reference chain: org.example.Article["date"]) 

was bedeutet, dass Der Zeitzonenparameter wird ignoriert, und der Formatierer von Datum und Uhrzeit weiß nicht, wie ein Instant ohne Zeitzone formatiert werden soll.

Gibt es eine Möglichkeit zum Deserialisieren eines ISO8601-Strings, der nicht in UTC-Zeitzonen-Offset zu Java 8 Instant mit Jackson und JavaTimeModule ist, ohne benutzerdefinierten Deserializer zu schreiben?

+0

seltsam, ich diesen Fehler expected 'Fehler beim Date-Wert analysiert '2016-03-28T19: 00: 00.000 + 01: 00' (Format:„yyyy-MM-dd'T "HH: mm: ss.SSSZ"): Ungültiges Datum: "2016-03-28T19: 00: 00.000 + 01: 00" 'und nachdem ich Ihren Code ausprobiert habe, habe ich in beiden Fällen einen solchen Fehler bekommen. Das Format stimmt nicht überein ... hast du es ohne Anmerkungen versucht? –

+0

oder mit diesem Muster: yyyy-MM-dd'T'HH: mm: ss.SSSXXX (siehe: https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html) –

+0

Ohne Anmerkungen funktioniert es nur, wenn der Offset als Z angegeben wird. Es funktioniert nicht für +0100 oder +01: 00. Ich habe versucht, Ihr Format und ich bekomme immer noch Unsupported field: YearOfEra Ausnahme, darauf hinweist, dass deserializer Formatierung ist nicht mit einer Zeitzone konfiguriert (aus irgendeinem Grund benötigt Java 8 fromatter TZ, obwohl der Offset in der Zeichenfolge angegeben ist und der Instant ist vollständig definiert) . –

Antwort

11

Sie müssen die explizite Zeitzone über XXX in Ihrer Modell-Klasse setzen:

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX") 
private Date date; 

(siehe: https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html)

+1

Das vorgeschlagene Format zusammen mit der Platzierung der Annotation an der richtigen Stelle löste das Problem. –

0

Das Format "Z" nicht mit der Arbeit "+01: 00" da dies ein anderes Muster ist. JsonFormat verwendet SimpleDateFormat-Muster. "Z" in Großbuchstaben steht nur für strenge RFC 822. Sie müssen Syntax wie verwenden: "+0100", ohne Doppelpunkt.

See: ISO 8601:2004, SimpleDateFormat patterns

Verwandte Themen