web-dev-qa-db-fra.com

LocalDateTime - désérialisation avec LocalDateTime.parse

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 de String ('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;
17
Andrew Tobilko

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.

27

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;
}
6
Yan Khonski