deserialize convertir java json java-8 gson

convertir - Java 8 LocalDateTime deserializado usando Gson



gson deserialize date (3)

El error se produce cuando está deserializando el atributo LocalDateTime porque GSON no puede analizar el valor del atributo porque no está al tanto de los objetos LocalDateTime.

Use el método registerTypeAdapter de GsonBuilder para definir el adaptador LocalDateTime personalizado. El siguiente fragmento de código le ayudará a deserializar el atributo 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();

Tengo JSON con un atributo de fecha y hora en el formato "2014-03-10T18: 46: 40.000Z", que quiero deserializar en un campo java.time.LocalDateTime usando Gson.

Cuando intenté deserializar, me sale el error:

java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING


Para extender aún más la respuesta de @Evers:

Puedes simplificar aún más con un lambda así:

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


Para extender la respuesta de @Randula, para analizar una cadena de fecha y hora zonificada (2014-03-10T18: 46: 40.000Z) a 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();