2016-03-27 23 views
16

Sto tentando di deserializzare una data formattata ISO8601 in Java8 Instant utilizzando Jackson. Ho registrato JavaTimeModule con ObjectMapper, disattivato WRITE_DATES_AS_TIMESTAMPS.Jackson deserializza data e ora con formattazione ISO8601 in Java8 Instant

Tuttavia, se si tenta di deserializzare 2016-03-28T19: 00: 00.000 + 01: 00 non funzionerà, perché sembra che JavaTimeModule sarà deserializzare unica data volte formattati con offset di fuso orario UTC (ad es 2016-03 -28T18: 00: 00.000Z). Allora ho provato ad utilizzare @JsonFormat annotazione in questo modo:

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

E in questo modo:

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

Tuttavia, nessuno di questi lavori e ottengo un'eccezione:

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

che implica che il parametro timezone viene ignorato e il formattatore della data non sa come formattare un Instant senza un fuso orario.

C'è un modo per deserializzare una stringa ISO8601 che non è in fuso orario UTC rispetto a Java 8 Instant utilizzando Jackson e JavaTimeModule senza scrivere deserializzatore personalizzato?

+0

strano, mi aspettavo questo errore 'Impossibile analizzare Data valore '2016-03-28T19: 00: 00.000 + 01: 00' (formato: "AAAA-MM-dd'T 'HH: mm: ss.SSSZ "): Data non analizzabile:" 2016-03-28T19: 00: 00.000 + 01: 00 "' e dopo aver provato il codice, ho ricevuto questo tipo di errore in entrambi i casi. Il formato non corrisponde ... l'hai provato senza annotazioni? –

+0

o con questo modello: aaaa-MM-gg'T'HH: mm: ss.SSSXXX (vedere: https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html) –

+0

Senza alcuna annotazione funziona, ma solo se l'offset è specificato come Z. Non funzionerà per +0100 o +01: 00. Ho provato il tuo formato e ottengo ancora l'eccezione Unsupported field: YearOfEra, a indicare che il formattatore del deserializer non è configurato con un fuso orario (per qualche motivo java 8 richiede TZ anche se l'offset è specificato nella stringa e Instant è completamente definito) . –

risposta

11

È necessario impostare il fuso orario esplicito tramite XXX nella classe del modello:

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

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

+1

L'utilizzo del formato suggerito insieme all'inserimento di annotazioni nel posto corretto ha risolto il problema. –

0

Il formato "Z" non funziona con "+01: 00" poiché questo è un modello diverso. JsonFormat sta utilizzando i modelli SimpleDateFormat. "Z" in maiuscolo rappresenta solo RFC 822 rigido. È necessario utilizzare la sintassi come "+0100", senza due punti.

See: ISO 8601:2004, SimpleDateFormat patterns