java - “2017-09-11 14:28:42”的 Json 反序列化失败,“虽然它似乎适合格式 'yyyy-MM-dd'T'HH:mm:ss.SSS'Z'''
问题描述
还有一些类似的线程,但我认为这是另一种情况。
我正在尝试从 JSON 反序列化日期字符串:
'2017-09-11 14:28:42'(没有 Z)
在我的 Json 文件中,该属性的类型为 java.util.Date,并带有以下注释:
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss", timezone = "Europe/Berlin")
虽然我收到此错误:
com.fasterxml.jackson.databind.exc.InvalidFormatException:无法从字符串“2017-09-11 14:28:42”反序列化 java.util.Date 类型的值:不是有效的表示(错误:无法解析日期值'2017-09-11 14:28:42':无法解析日期“2017-09-11 14:28:42Z”:虽然它似乎适合格式 'yyyy-MM-dd'T'HH:mm:ss .SSS'Z'',解析失败(宽容?空))
为什么它会在我的原始字符串“2017-09-11 14:28:42”中生成“2017-09-11 14:28:42Z”。为什么要添加这个'Z'?在其他线程中,解决方案是使用@JsonFormat 或从字符串中删除此“Z”。好吧,我仍在使用@JsonFormat,字符串中最初没有“Z”。
当向邮递员请求资源时,我得到了相关属性的这个值:
"deviceStatusSince": "2017-09-11 14:28:42",
任何帮助将不胜感激。
编辑#1 完整堆栈跟踪:
E/ASYNCTASKLOADDEVICEFROM: Deserialization of response failed! response: [{"id":4,"deviceId":"abc123def","deviceName":"mymachinename","deviceType":"mymachinetype","deviceStatus":1,"deviceStatusSince":"2017-09-11 14:28:42","location":"somewhere","created":"2019-01-24 19:25:11","updated":"2019-01-24 19:25:11","lamport_timestamp":3},{"id":5,"deviceId":"abc123def","deviceName":"mymachinename","deviceType":"mymachinetype","deviceStatus":1,"deviceStatusSince":"2017-09-11 14:28:42","location":"somewhere","created":"2019-01-24 20:10:29","updated":"2019-01-24 20:10:29","lamport_timestamp":3}]
com.fasterxml.jackson.databind.exc.InvalidFormatException: Can not deserialize value of type java.util.Date from String "2017-09-11 14:28:42": not a valid representation (error: Failed to parse Date value '2017-09-11 14:28:42': Can not parse date "2017-09-11 14:28:42Z": while it seems to fit format 'yyyy-MM-dd'T'HH:mm:ss.SSS'Z'', parsing fails (leniency? null))
at [Source: (String)"[{"id":4,"deviceId":"5123b85f316a9_01","deviceName":"Maschine #123","deviceType":"mymachinetype","deviceStatus":1,"deviceStatusSince":"2017-09-11 14:28:42","location":"somewhere","created":"2019-01-24 19:25:11","updated":"2019-01-24 19:25:11","lamport_timestamp":3},{"id":5,"deviceId":"abc123def","deviceName":"mymachinename","deviceType":"mymachinetype","deviceStatus":1,"deviceStatusSince":"2017-09-11 14:28:42","location":"somewhere","created":"2019-01-24 20:10:29","updated":"[truncated 45 chars]; line: 1, column: 135] (through reference chain: java.util.ArrayList[0]->my.project.models.json.DeviceJson["deviceStatusSince"])
at com.fasterxml.jackson.databind.DeserializationContext.weirdStringException(DeserializationContext.java:1504)
at com.fasterxml.jackson.databind.DeserializationContext.handleWeirdStringValue(DeserializationContext.java:910)
at com.fasterxml.jackson.databind.deser.std.StdDeserializer._parseDate(StdDeserializer.java:513)
at com.fasterxml.jackson.databind.deser.std.StdDeserializer._parseDate(StdDeserializer.java:466)
at com.fasterxml.jackson.databind.deser.std.DateDeserializers$DateBasedDeserializer._parseDate(DateDeserializers.java:195)
at com.fasterxml.jackson.databind.deser.std.DateDeserializers$DateDeserializer.deserialize(DateDeserializers.java:285)
at com.fasterxml.jackson.databind.deser.std.DateDeserializers$DateDeserializer.deserialize(DateDeserializers.java:268)
at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:127)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:287)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:151)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:285)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:244)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:27)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3999)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2999)
at my.project.remote.async.AsyncTaskLoadDevicesFromServer.onPostExecute(AsyncTaskLoadDevicesFromServer.java:147)
at my.project.remote.async.AsyncTaskLoadDevicesFromServer.onPostExecute(AsyncTaskLoadDevicesFromServer.java:46)
at android.os.AsyncTask.finish(AsyncTask.java:695)
at android.os.AsyncTask.access$600(AsyncTask.java:180)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:712)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
E/ASYNCTASKLOADDEVICEFROM: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Edit#2:将属性设置为 null 时,它可以工作。但我想注意到创建和更新的属性配置相似(@JsonAnnotation,相同的模式,相同的字符串)。那里有什么不同,我看不到什么?
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss", timezone = "Europe/Berlin") private Date created;
编辑#3:这是用于通过 objectMapper.readValue 反序列化的响应:
[{"id":8,"deviceId":"abc123def","deviceName":"mymachine","deviceType":"mymachinetype","deviceStatus":1,"deviceStatusSince":"2017-09-10 13:37:42","location":"somewhere","created":"2019-01-26 01:09:06","updated":"2019-01-26 01:09:06","lamport_timestamp":3}]
解决方案
我通过从创建的字段复制来重新创建另一个字段并删除了此处提到的状态字段。新字段有效,然后我将其重命名。也许一个看不见的迹象是原因,我不知道。
推荐阅读
- c# - Websocket 代码在控制台中有效,但在 winform 中无效
- regex - 每千位数
- python - 根据 dask 数据框中的条件更改列变量值
- java - 使用来自模型向量的数据(具有很少的属性),而无需在 JAVA 中的 WEKA API 中制作 ARFF 文件
- twilio - 查看使用 Twilio 函数生成的 twiml
- c# - 在 C# 中使用“浮动”结构解析 XML 并填充列表框
- c++ - 拓扑排序中的邻接表表示
- codenameone - 将 PropertyBusinessObjects 列表保存到存储中
- javascript - 如何在电子 renderer.js 文件中使用 Node.js 解析 JSON?
- opencsv - 使用 OpenCSV,如何使用 MappingStrategy 附加到现有 CSV?