json 使用Gson反序列化的Java 8 LocalDateTime

wztqucjr  于 2023-03-24  发布在  Java
关注(0)|答案(5)|浏览(216)

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

java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING
n9vozmp4

n9vozmp41#

反序列化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();
bhmjp9jg

bhmjp9jg2#

扩展@Randula的答案,将分区的日期时间字符串(2014-03- 10 T18: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();
ua4mk5z4

ua4mk5z43#

进一步扩展@Evers的答案:
你可以用lambda来进一步简化如下:

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

qc6wkl3g4#

以下为我工作。

** 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,存储为String类型

Json:

“dateField”:“2020-01-30 15:00”
其中***dateField***的***LocalDateTime***类型存在于stringJson String变量中。

izkcnapc

izkcnapc5#

正如上面的注解中所提到的,您还可以使用已经可用的序列化程序。
https://github.com/gkopff/gson-javatime-serialisers
您将其包含在项目中。

<dependency>
  <groupId>com.fatboyindustrial.gson-javatime-serialisers</groupId>
  <artifactId>gson-javatime-serialisers</artifactId>
  <version>1.1.2</version>
</dependency>

然后将其包含到GsonBuilder流程中

final Gson gson = Converters.registerOffsetDateTime(new GsonBuilder()).create();
final OffsetDateTime original = OffsetDateTime.now();

final String json = gson.toJson(original);
final OffsetDateTime reconstituted = gson.fromJson(json, OffsetDateTime.class);

为了防止不清楚,不同的类类型存在不同的方法。

相关问题