Java 8 LocalDateTime 使用 Gson 反序列化

2022-09-01 00:22:48

我有一个日期时间属性的JSON,格式为“2014-03-10T18:46:40.000Z”,我想使用Gson将其反序列化为java.time.LocalDateTime字段。

当我尝试反序列化时,我收到错误:

java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING

答案 1

反序列化 LocalDateTime 属性时会发生此错误,因为 GSON 无法分析属性的值,因为它无法识别 LocalDateTime 对象。

使用 GsonBuilder 的 registerTypeAdapter 方法定义自定义 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();