Джексон Котлин - Невозможно десериализовать экземпляр `java.util.ArrayList` из токена START_OBJECT - PullRequest
0 голосов
/ 22 мая 2018

Я получаю строку json из Fitbit API.Я хочу сохранить поля dateTime и value в объекте List.Я использую модуль Джексона kotlin.Для этого я создал класс данных ActivitiesSteps.

Я не знаю, как избежать поля "активность-шаги", и я застреваю.

Это тело JSON (предоставляется впеременная 'jsonSteps' для метода readValue в моем коде ниже):

  {  
   "activities-steps":[  
      {  
         "dateTime":"2018-04-17",
         "value":"11045"
      },
      {  
         "dateTime":"2018-04-18",
         "value":"14324"
      },
      {  
         "dateTime":"2018-05-16",
         "value":"11596"
      }
   ]
}

Вот мой класс для сохранения моих данных:

data class ActivitiesSteps(var dateTime: String, var value: String)

Вот мой код с использованием Джексона:

val mapper = jacksonObjectMapper()
val stepsList = mapper.readValue<List<ActivitiesSteps>>(jsonSteps)

И выдается следующее исключение:

Exception in thread "main" com.fasterxml.jackson.databind.exc.MismatchedInputException: 
Cannot deserialize instance of `java.util.ArrayList` out of 
START_OBJECT token at 

[Source: (String)"{"activities-steps":[
{"dateTime":"2018-04-17","value":"11045"},
{"dateTime":"2018-04-25","value":"8585"},
{"dateTime":"2018-04-26","value":"11218"},
{"dateTime":"2018-04-27","value":"10462"},
{"dateTime":"2018-04"[truncated 762 chars]; line: 1, column: 1]

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

У вас должен быть внешний объект, который соответствует верхнему уровню JSON.В этом случае измените свой код на:

data class ActivityConfig(
    @JsonProperty("activities-steps") val steps: List<ActivitiesSteps> = emptyList()
)

data class ActivitiesSteps(var dateTime: String, var value: String)

val stepsList = mapper.readValue<ActivityConfig>(jsonSteps).steps

Вы можете использовать значения по умолчанию с модулем Джексона Котина, если вы хотите, чтобы список всегда присутствовал, а также вам не нужны var члены в данныхКласс, если хотите, val отлично работает и с Джексоном, если только вы действительно не хотите изменять значения.

0 голосов
/ 22 мая 2018

Проблема в том, что массив, который вы пытаетесь получить, обернут в объект, который вы вводите в Джексона и запрашиваете список обратно.JSON Object-to-Java List не является переводом, который понимает Джексон, поэтому он задыхается.

Я бы создал класс, который переносит этот List, и попытался бы десериализовать его.

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