Java 8 LocalDateTime десериализован с использованием Gson

У меня есть JSON с атрибутом даты и времени в формате "2014-03-10T18: 46: 40.000Z", который я хочу десериализовать в поле java.time.LocalDateTime, используя Gson.

Когда я попытался десериализовать, я получаю сообщение об ошибке:

java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING

Ответы

Ответ 1

Ошибка возникает при десериализации атрибута LocalDateTime, поскольку GSON не анализирует значение атрибута, поскольку оно не знает об объектах LocalDateTime.

Использовать метод registerSypeAdapter GsonBuilder для определения пользовательского адаптера LocalDateTime. Следующий фрагмент кода поможет вам десериализовать атрибут 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();

Ответ 2

Чтобы продлить ответ @Randula, проанализируйте строку времени с зоной даты (2014-03-10T18: 46: 40.000Z) в 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();

Ответ 3

Чтобы еще больше увеличить @Evers ответ:

Вы также можете упростить с помощью лямбда:

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