当前位置: 首页 > 知识库问答 >
问题:

Gson无法正确序列化/反序列化日期

马峻
2023-03-14

奇怪的是下面的测试用例会失败。有人知道为什么吗?

Gson gson = new GsonBuilder()
    .setDateFormat("yyyy-MM-dd hh:mm:ss.SSS")
    .create();
Date date = new Date();
String json = gson.toJson(date);
System.out.println(date);
Date date2 = gson.fromJson(json, Date.class);
System.out.println(date2);
assertEquals(date2, date);

共有1个答案

聂和宜
2023-03-14

这是因为一些数据丢失和默认的java。util。日期构造函数对毫秒敏感,但默认的Gson日期/时间格式配置(您可能正在使用它)忽略毫秒。只需进行比较,以确保:

System.out.println(date.getTime());
System.out.println(date2.getTime());

默认的Gson日期/时间序列化程序(不是反序列化程序)格式是DateTimeAdapter。enUsFormat(从Gson 2.8.0开始),不包括到目前为止的毫秒JSON表示。要克服这种行为,您只需定义一种模式,该模式将尊重所有时间值,包括毫秒:

private static final Gson gson = new GsonBuilder()
        .setDateFormat("yyyy-MM-dd hh:mm:ss.SSS")
        .create();

有个打字错误<代码>yyyy-MM-dd hh:MM:ss。SSS在00:00到11:59(含)之间工作,但在12:00到23:59之间失败。我早上测试了它,所以我没有注意到我错了。:)更准确的格式是yyyy-MM-dd HH:MM:ss。SSS--HH表示00范围内的一小时。。23:

.setDateFormat("yyyy-MM-dd HH:mm:ss.SSS")
 类似资料:
  • 我有一门课是这样的: 但是当我试图序列化它时,我收到一个错误,上面写着“试图序列化java.lang.class:java.lang.字符串。忘记注册一个类型适配器了吗?”。所以我创建了这个适配器: } 并登记如下: 但我还是犯了同样的错误<我做错了什么 适配器的实现看起来正常吗?

  • 问题内容: 我试图序列化和反序列化内部对象的数组列表: HairList对象也是一个可序列化的对象。 此代码执行返回以下错误: 排队 我不知道我在做什么错。你能给个小费吗? 更新: 解决: 仅使用HairBirt的本机数组而不是ArrayList即可工作: 代替 感谢大家的帮助。 问题答案: 不要使用-而是使用二进制数据并对它进行base64编码,以将其转换为字符串而不会丢失信息。 我强烈怀疑这是

  • 问题内容: 我一直在尝试将对象序列化为CSV,但是该对象包含,并且不能在对象上使用。 预期样本输出 : 实际输出 : 这是我的代码 :(其中大多数是2个POJO) 我尝试的一切似乎都没有任何效果,但找不到有效的解决方案。 抱歉,我无缘无故留下的毫无意义的注释,如果您回答了代码,请随时删除它们。 问题答案: 从错误中,我想相信这与您的模式有关,该模式的列取自on 而不是值。 您可能想在其中添加,但是

  • 问题内容: 我如何使用gson 2.2.4序列化和反序列化一个简单的枚举? 问题答案: 根据 GsonAPI文档 ,Gson提供了的默认序列化/反序列化,因此基本上,应使用标准和方法(与其他类型一样)对序列化和反序列化。

  • 我以前从未使用过JSON,我想序列化

  • 问题内容: 我想通过Google Gson传输列表对象,但是我不知道如何反序列化泛型类型。 看了这个之后我尝试了什么(BalusC的答案): 但是后来我在日食中遇到了一个错误,说“新的List(){}类型必须实现继承的抽象方法…”,如果我使用快速修复方法,则会得到20个以上的方法存根的怪物。 我很确定有一个更简单的解决方案,但是我似乎找不到它! 编辑: 我现在有 但是,我确实在“ fromJson