gpt4 book ai didi

java - 如何使用 gson 以纳秒精度反序列化 JSON 日期时间

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:48:52 24 4
gpt4 key购买 nike

我正在尝试使用 gson 反序列化 JSON 对象,但在日期方面遇到问题。日期是从 JSON 对象反序列化而来的,但是由于 JSON 对象中的值以纳秒为单位,所以我得到的值与预期值略有不同。

看下面的代码

JSON类

public class JSONClass {
private Date timestamp;

public Date getTimestamp() {
return timestamp;
}

public void setTimestamp(Date timestamp) {
this.timestamp = timestamp;
}
}

主要

public class GsonTestApplication {
public static void main(String[] args) {
final Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss.SSS").create();
final String responseJSON = "{ \"timestamp\":\"2017-11-09 11:07:20.079364+00\" }";
final JSONClass foo = gson.fromJson(responseJSON, new TypeToken<JSONClass>(){}.getType());
System.out.println(foo.getTimestamp().toString());
}
}

应用程序的输出是

Thu Nov 09 11:08:39 GMT 2017

如我所愿

Thu Nov 09 11:07:20 GMT 2017

我不关心纳秒精度,所以我很高兴它被截断,但由于我无法控制 JSON 格式,所以我不确定执行此操作的最佳方法。

如何让 gson 正确反序列化日期?

最佳答案

这是 Date 中可用精度的问题,对于 Java 8,最好使用 LocalDateTime。这也意味着您将需要一个 TypeAdapter,因为 Gson 不能很好地与 LocalDateTime 配合使用。这种类型的适配器需要在 Gson 中注册以反序列化(并可能序列化)String 中的 LocalDateTime 对象。

类似下面的内容应该可以满足您的需求。

JSON类

public class JSONClass {
private LocalDateTime timestamp;

public LocalDateTime getTimestamp() {
return timestamp;
}

public void setTimestamp(LocalDateTime timestamp) {
this.timestamp = timestamp;
}
}

LocalDateTimeDeserialiser

static class LocalDateTimeDeserializer implements JsonDeserializer<LocalDateTime> {

private DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;

LocalDateTimeDeserializer(String datePattern) {
this.formatter = DateTimeFormatter.ofPattern(datePattern);
}

@Override
public LocalDateTime deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
return LocalDateTime.parse(json.getAsString(), formatter);
}

主要

public class GsonTestApplication {
public static void main(String[] args) {
final Gson gson = new GsonBuilder().(LocalDateTime.class, new LocalDateTimeDeserializer("yyyy-MM-dd HH:mm:ss.SSSSSSx")).create();
final String responseJSON = "{ \"timestamp\":\"2017-11-09 11:07:20.079364+00\" }";
final JSONClass foo = gson.fromJson(responseJSON, new TypeToken<JSONClass>(){}.getType());
System.out.println(foo.getTimestamp().toString());
}
}

关于java - 如何使用 gson 以纳秒精度反序列化 JSON 日期时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47201044/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com