【发布时间】:2021-10-29 03:32:15
【问题描述】:
我有一个 Java Spring REST API,它在 POST 请求的正文中接收 JSON 字符串。 JSON 字符串很大;它包含多个嵌套对象。
收到 POST 请求后,我将字符串转换为 DTO 对象。
问题
其中一个嵌套对象包含未正确反序列化的键 startDate。
startDate 对象的值为:
"startDate": 1622746800000
我尝试使用Jackson 和Gson 对字符串进行反序列化,但它们都无法正确解析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
DateAPI,它只是new Date(1622746800000)。因为它是一个数字而不是字符串,所以根本不应该涉及解析。 -
你的日期格式是什么?你可以使用
com.fasterxml.jackson.annotation.JsonFormat注解来设置期望的格式。 -
@geanakuch 添加了我用来解析从前端收到的字符串的代码。
-
@akuma8 添加了一张显示
startDate格式的图片。
标签: java spring spring-mvc jackson gson