J'ai le champ initiationDate
qui sérialise par classe ToStringSerializer
au format ISO-8601.
@JsonSerialize(using = ToStringSerializer.class)
private LocalDateTime initiationDate;
Lorsque je reçois le JSON suivant,
...
"initiationDate": "2016-05-11T17:32:20.897",
...
Je veux le désérialiser par la méthode d'usine LocalDateTime.parse(CharSequence text)
. Toutes mes tentatives se sont terminées par com.fasterxml.jackson.databind.JsonMappingException
:
Impossible d'instancier la valeur de type [type simple, classe
Java.time.LocalDateTime
] À partir de la valeur deString
('2016-05-11T17:32:20.897'
); no single -String
méthode constructeur/usine
Comment puis-je y parvenir? Comment spécifier la méthode d'usine?
ÉDITER:
Le problème a été résolu en incluant module jackson-datatype-jsr31 dans le projet et en utilisant @JsonDeserialize
Avec LocalDateTimeDeserializer
.
@JsonSerialize(using = ToStringSerializer.class)
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
private LocalDateTime initiationDate;
Vanilla Jackson n'a aucun moyen de désérialiser un objet LocalDateTime
à partir d'une valeur de chaîne JSON.
Vous avez quelques options. Vous pouvez créer et enregistrer votre propre JsonDeserializer
qui utilisera LocalDateTime#parse
.
class ParseDeserializer extends StdDeserializer<LocalDateTime> {
public ParseDeserializer() {
super(LocalDateTime.class);
}
@Override
public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
return LocalDateTime.parse(p.getValueAsString()); // or overloaded with an appropriate format
}
}
...
@JsonSerialize(using = ToStringSerializer.class)
@JsonDeserialize(using = ParseDeserializer.class)
private LocalDateTime initiationDate;
Ou vous pouvez ajouter Jackson's Java.time
extension dans votre chemin de classe et enregistrez le Module
approprié avec votre ObjectMapper
.
objectMapper.registerModule(new JavaTimeModule());
et laissez Jackson faire la conversion pour vous. En interne, cela utilise LocalDateTime#parse
avec l'un des formats standard. Heureusement, il prend en charge des valeurs telles que
2016-05-11T17:32:20.897
hors de la boîte.
Pour ceux qui souhaitent analyser le format date-heure personnalisé.
1) Ajouter une dépendance
compile "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.8.8"
2) Annotation Json avec format date-heure
public class ClientRestObject {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime timestamp;
}
3) Enregistrer le module Java8 dans ObjectMapper
private static ObjectMapper buildObjectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
//To parse LocalDateTime
objectMapper.registerModule(new JavaTimeModule());
return objectMapper;
}