web-dev-qa-db-fra.com

Java 8 LocalDateTime désérialisé à l'aide de Gson

J'ai des JSON avec un attribut date-heure au format "2014-03-10T18: 46: 40.000Z", que je veux désérialiser en un champ Java.time.LocalDateTime en utilisant Gson.

Lorsque j'ai essayé de désérialiser, j'obtiens l'erreur:

Java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING
29
fische

L'erreur se produit lorsque vous désérialisez l'attribut LocalDateTime car GSON ne parvient pas à analyser la valeur de l'attribut car il ne connaît pas les objets LocalDateTime.

Utilisez la méthode registerTypeAdapter de GsonBuilder pour définir l'adaptateur LocalDateTime personnalisé. L'extrait de code suivant vous aidera à désérialiser l'attribut LocalDateTime.

Gson gson = new GsonBuilder().registerTypeAdapter(LocalDateTime.class, new JsonDeserializer<LocalDateTime>() {
    @Override
    public LocalDateTime deserialize(JsonElement json, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
        Instant instant = Instant.ofEpochMilli(json.getAsJsonPrimitive().getAsLong());
        return LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
    }
}).create();
20
Randula

Pour étendre la réponse de @ Randula, pour analyser une chaîne de date et d'heure zonée (2014-03-10T18: 46: 40.000Z) vers JSON:

Gson gson = new GsonBuilder().registerTypeAdapter(LocalDateTime.class, new JsonDeserializer<LocalDateTime>() {
@Override
public LocalDateTime deserialize(JsonElement json, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
    return ZonedDateTime.parse(json.getAsJsonPrimitive().getAsString()).toLocalDateTime();
}
}).create();
16
Evers

Pour étendre encore plus la réponse @Evers:

Vous pouvez simplifier davantage avec un lambda comme ceci:

GSON GSON = new GsonBuilder().registerTypeAdapter(LocalDateTime.class, (JsonDeserializer<LocalDateTime>) (json, type, jsonDeserializationContext) ->
    ZonedDateTime.parse(json.getAsJsonPrimitive().getAsString()).toLocalDateTime()).create();
14
nterry