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();