Десериализация Json в «2017-09-11 14:28:42» завершается неудачно с «в то время как кажется, что он соответствует формату» гггг-ММ-дд'Т'ХЧ: мм: сс.ССС'З '' ' - PullRequest
0 голосов
/ 25 января 2019

есть еще некоторые похожие темы, но я думаю, что это другая ситуация.

Я пытаюсь десериализовать строку даты из JSON:

'2017-09-1114:28:42 '(без Z) * ​​1006 *

В моем файле 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: Невозможно десериализовать значение типа java.util.Date из строки "2017-09-11 14:28:42": недопустимое представление (ошибка: не удалось выполнить синтаксический анализ значения даты '2017-09-11 14:28:42': невозможно проанализировать дату "2017-09-11 14: 28: 42Z": пока формат не соответствует формату 'yyyy-MM-dd'T'HH: mm: ss.SSS'Z '', синтаксический анализ не выполняется (снисходительность? null))

Какого черта это делает "2017-09-11 14: 28: 42Z "моей исходной строки" 2017-09-11 14:28:42 ".Почему это добавляет это 'Z'?В других потоках решение состояло в том, чтобы использовать @JsonFormat или удалить этот 'Z' из строки.Что ж, я все еще использую @JsonFormat, и изначально в строке нет 'Z'.

При запросе ресурса у почтальона я получаю это значение для соответствующего свойства:

    "deviceStatusSince": "2017-09-11 14:28:42",

Любая помощь будет благодарна.

Редактировать # 1 Full StackTrace:

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)

Редактировать # 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}]

1 Ответ

0 голосов
/ 19 февраля 2019

Я воссоздал другое поле, скопировав из созданного поля и удалил упомянутое здесь поле состояния.Новое поле сработало, потом я его переименовал.Может быть, причина была невидимая, я не знаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...