Jackson deserialize ISO8601 fromatted date-time en Java8 Instant

j'essaie de désérialiser une date formatée ISO8601 en Java8 instantané en utilisant Jackson. J'ai enregistré JavaTimeModule avec L'ObjectMapper, éteint WRITE_DATES_AS_TIMESTAMPS.

cependant, si l'on essaie de desérialiser 2016-03-28T19:00:00.000+01:00 cela ne marchera pas, car il semble que JavaTimeModule ne désérialisera que les dates-heures formatées avec UTC timezone offset (e.g. 2016-03-28T18:00:00.000 Z). J'ai ensuite essayé d'utiliser @JsonFormat annotation comme ceci:

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

Et comme ceci:

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

cependant, ni l'un ni l'autre de ces travaux et je reçois une exception:

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

ce qui implique que le paramètre timezone est ignoré et date time formatter ne sait pas comment formater un Instant sans timezone.

y a-t-il un moyen de desérialiser une chaîne ISO8601 qui n'est pas dans le décalage horaire UTC de Java 8 Instant en utilisant Jackson et JavaTimeModule sans écrire custom deserializer?

20
demandé sur Kresimir Nesek 2016-03-27 23:55:58

2 réponses

vous devez définir le fuseau horaire explicite via XXX dans votre classe modell:

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
private Date date;
https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html)

19
répondu Meiko Rachimow 2017-08-23 09:06:00

Le format "Z" ne fonctionne pas avec "+01:00" c'est un modèle différent. JsonFormat utilise des motifs SimpleDateFormat. "Z" in majuscule représente uniquement la RFC 822. Vous devez utiliser la syntaxe comme: "+0100", sans deux points.

Voir: ISO 8601: 2004, SimpleDateFormat patterns

0
répondu Mick Belker - Pseudonym 2016-06-24 07:39:17