无法使用 Jackson 和 Gson 解析日期值
Unable to parse date value using Jackson and Gson
我有一个 Java Spring REST API 在 POST 请求的主体中接收 JSON 字符串。 JSON 字符串很大;它包含多个嵌套对象。
收到 POST 请求后,我将字符串转换为 DTO 对象。
问题
其中一个嵌套对象包含未正确反序列化的键 startDate
。
startDate
对象的值为:
"startDate": 1622746800000
我尝试使用 Jackson
和 Gson
反序列化字符串,但它们都无法正确解析 startDate
。
使用 Gson
时抛出异常:
java.text.ParseException: Unparseable date: "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 类似,但对我的情况没有帮助。
下图显示了 Intellij IDEA 表达式计算器中 startDate
的格式:
序列化时的以上值变为:1622746800000
,这就是我要反序列化的内容。
据我了解,Gson
默认情况下无法反序列化纪元时间。但是 Jackson
可以。
对于 Jackson,您可以执行以下操作,
ObjectMapper mapper = new ObjectMapper();
MyDTOClass evData = mapper.readValue(evDataJsonStr, MyDTOClass.class);
请注意它的ObjectMapper的readValue
方法不是convertValue
方法
我有一个 Java Spring REST API 在 POST 请求的主体中接收 JSON 字符串。 JSON 字符串很大;它包含多个嵌套对象。
收到 POST 请求后,我将字符串转换为 DTO 对象。
问题
其中一个嵌套对象包含未正确反序列化的键 startDate
。
startDate
对象的值为:
"startDate": 1622746800000
我尝试使用 Jackson
和 Gson
反序列化字符串,但它们都无法正确解析 startDate
。
使用 Gson
时抛出异常:
java.text.ParseException: Unparseable date: "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 类似,但对我的情况没有帮助。
下图显示了 Intellij IDEA 表达式计算器中 startDate
的格式:
序列化时的以上值变为:1622746800000
,这就是我要反序列化的内容。
据我了解,Gson
默认情况下无法反序列化纪元时间。但是 Jackson
可以。
对于 Jackson,您可以执行以下操作,
ObjectMapper mapper = new ObjectMapper();
MyDTOClass evData = mapper.readValue(evDataJsonStr, MyDTOClass.class);
请注意它的ObjectMapper的readValue
方法不是convertValue
方法