【问题标题】:Gson mess up with minute valueGson 搞砸了分钟值
【发布时间】:2020-05-27 06:13:42
【问题描述】:

我正在使用 gson 将序列化消息转换为对象,但将一个属性转换为 java.sql.Timestamp 时遇到问题

JSON 中的开始时间属性是

{...other_fields, "start_time": "2020-05-27 05:23:43.022610"}

我的 Gson 解析器就是这样初始化的

new GsonBuilder().serializeNulls().setDateFormat("yyyy-MM-dd HH:mm:ss.S").create();

对象已正​​确解析,但开始时间具有不同的分钟和秒值。解析开始时间的结果是:2020-05-27 05:24:05.61

我错过了什么?

编辑1

Java 版本:1.8
Gson 版本:2.8.2

编辑2

将格式更改为yyyy-MM-dd HH:mm:ss后(省略 毫秒)我得到了正确的结果,但没有毫秒值。 我可以忍受,但如果有人仍然可以 解释这个问题。

【问题讨论】:

  • 我认为stackoverflow.com/questions/26044881/… 可以帮助您理解这一点。
  • 好吧,有一个S022610 显然被解释为 22610 毫秒。您的预期时间加上 22610 毫秒等于您得到的结果。
  • @Maede 这家伙正在经历时区偏移偏移。我可以解决这个问题。我的问题是分钟、秒和毫秒完全搞砸了
  • @MCEmperor 是的,看起来就是这个问题

标签: java timestamp gson


【解决方案1】:

GsonBuilder.setDateFormat() 使用 SimpleDateFormat

并且SimpleDateFormat 在解析期间不支持微秒。 S 表示毫秒,仅表示小数点后 3 位。

这是可以证明的。在您的 JSON 中删除微秒并使用 2020-05-27 05:23:43.022 作为输入。

输出将是

2020-05-27 05:23:43.022

Timestamp确实支持微秒,如果你想将2020-05-27 05:23:43.022610(微秒)转换为Timestamp,你最好写一个custom GSON deserializer

编辑:时间戳的示例反序列化器

class TimestampDeserializer implements JsonDeserializer<Timestamp> {

    @Override
    public Timestamp deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        // Handle null checks or format check, etc.
        return Timestamp.valueOf(json.getAsString());
    }
}

用法:

Gson gson = new GsonBuilder().serializeNulls().registerTypeAdapter(Timestamp.class, new TimestampDeserializer()).create();

【讨论】:

  • 我尝试在小数点后仅使用 3 位数字,并且按照您的说法工作。时间戳反序列化器的工作方式也很迷人。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-15
  • 2012-04-14
  • 1970-01-01
相关资源
最近更新 更多