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

时间:2017-11-09 11:46:24

标签: java json gson

我正在尝试使用gson对JSON对象进行反序列化,但在日期方面存在问题。日期从JSON对象反序列化,但由于JSON对象中的值以纳秒为单位,因此我获得的值略微偏离预期值。

请参阅以下代码

JSONClass

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正确地反序列化日期?

1 个答案:

答案 0 :(得分:1)

这是Date中可用精度的问题,而使用Java 8时,最好使用LocalDateTime。这也意味着您需要TypeAdapter,因为Gson与LocalDateTime的合作效果不佳。需要在Gson中注册此类型适配器以从LocalDateTime反序列化(并可能序列化)String个对象。

以下内容应该能满足您的需求。

<强> JSONClass

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());
    }
}