3 votes

Désérialiser l'heure "Zulu" au format ISO8601 avec Jackson

J'ai besoin de désérialiser l'heure au format 2016-11-28T10:34:25.097Z en utilisant Jackson pour obtenir ZonedDateTime de Java8.

Je pense avoir correctement configuré ObjectMapper (une méthode factory) :

 @Bean
ObjectMapper getObjectMapper() {
    ObjectMapper objectMapper = new ObjectMapper();
    // some other config...
    objectMapper.registerModule(new JavaTimeModule());
    return objectMapper;
}

Et j'ai dans mon code pour le DTO un champ

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

lorsque j'essaie de le parser avec Jackson, j'obtiens

 java.lang.IllegalArgumentException: Impossible de désérialiser la valeur de type java.time.ZonedDateTime 
 à partir de la chaîne "2016-11-28T10:34:25.097Z" : Le texte '2016-11-28T10:34:25.097Z' n'a pas pu être analysé,
 texte non analysé trouvé à l'index 23  à [Source: N/A; line: -1, column: -1]  

Sans @JsonFormat le problème persiste.

Comment pourrais-je surmonter cela?

3voto

pkalinow Points 50

Le problème se situe probablement avec 'Z' dans le motif. Il ne permet pas le 'Z' littéral dans la valeur de date et d'heure. Essayez plutôt 'X'.

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

0voto

Philipp Wirth Points 11

À mon avis, le JsonFormat suivant pour l'ISO 8601

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

est bien meilleur, car ce format est plus intuitif à lire et permet également des fuseaux horaires comme l'ACST avec un décalage UTC de +09:30.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X