我的JSON具有日期时间属性,格式为“2014-03-10T18:46:40.000Z”,我想使用Gson将其反序列化为java.time.LocalDateTime字段。
当我尝试反序列化时,我收到错误:
java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING
答案 0 :(得分:19)
当您反序列化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();
答案 1 :(得分:16)
扩展@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();
答案 2 :(得分:12)
进一步扩展@Evers答案:
您可以使用lambda进一步简化:
GSON GSON = new GsonBuilder().registerTypeAdapter(LocalDateTime.class, (JsonDeserializer<LocalDateTime>) (json, type, jsonDeserializationContext) ->
ZonedDateTime.parse(json.getAsJsonPrimitive().getAsString()).toLocalDateTime()).create();
答案 3 :(得分:2)
以下为我工作。
Java:
Gson gson = new GsonBuilder().registerTypeAdapter(LocalDateTime.class, new JsonDeserializer<LocalDateTime>() {
@Override
public LocalDateTime deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
return LocalDateTime.parse(json.getAsString(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")); }
}).create();
Test test = gson.fromJson(stringJson, Test.class);
其中 stringJson 是一个以字符串类型存储的Json
Json:
“ dateField”:“ 2020-01-30 15:00”
其中 dateField 的类型为 LocalDateTime 类型,该类型存在于stringJson String变量中。