【问题标题】:Unable to parse date value using Jackson and Gson无法使用 Jackson 和 Gson 解析日期值
【发布时间】:2021-10-29 03:32:15
【问题描述】:

我有一个 Java Spring REST API,它在 POST 请求的正文中接收 JSON 字符串。 JSON 字符串很大;它包含多个嵌套对象。

收到 POST 请求后,我将字符串转换为 DTO 对象。

问题

其中一个嵌套对象包含未正确反序列化的键 startDate

startDate 对象的值为:

"startDate": 1622746800000

我尝试使用JacksonGson 对字符串进行反序列化,但它们都无法正确解析startDate

使用Gson时抛出异常:

java.text.ParseException:无法解析的日期:“1622746800000”

如果我将startDate 作为null 传递,一切正常 - 字符串被正确转换为 DTO 对象。

问题

知道可能导致此问题的原因是什么吗?我该如何解决?


P.S.startDate 的值是作为后端响应的一部分接收的。我将相同的响应字符串发送到 POST 请求正文中的后端。


代码:

以下是解析请求正文中收到的字符串的代码:

ObjectMapper mapper = new ObjectMapper();
MyDTOClass evData = mapper.convertValue(evDataJsonStr, MyDTOClass.class);

我也试过Gson

Gson mapper = new Gson();
MyDTOClass evData = mapper.fromJson(evDataJsonStr, MyDTOClass.class);

这个question 很相似,但对我没有帮助。

下图显示了startDate 的格式,如 Intellij IDEA 的表达式求值器所示:

序列化后的值变为:1622746800000,这就是我要反序列化的内容。

【问题讨论】:

  • 你如何解析日期?我假设该数字是以毫秒为单位的纪元时间。也许您的解析器需要特定的日期格式。使用旧的 Java Date API,它只是 new Date(1622746800000)。因为它是一个数字而不是字符串,所以根本不应该涉及解析。
  • 你的日期格式是什么?你可以使用com.fasterxml.jackson.annotation.JsonFormat注解来设置期望的格式。
  • @geanakuch 添加了我用来解析从前端收到的字符串的代码。
  • @akuma8 添加了一张显示startDate 格式的图片。

标签: java spring spring-mvc jackson gson


【解决方案1】:

据我了解,Gson 默认情况下无法反序列化纪元时间。但是Jackson可以。

对于杰克逊,您可以执行以下操作,

ObjectMapper mapper = new ObjectMapper();
MyDTOClass evData = mapper.readValue(evDataJsonStr, MyDTOClass.class);

请注意它的 ObjectMapper 的 readValue 方法不是 convertValue 方法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-08
    • 2018-05-12
    • 1970-01-01
    • 2017-06-28
    • 1970-01-01
    相关资源
    最近更新 更多