Джексон Котлин - Невозможно десериализовать экземпляр `java.util.ArrayList` из токена START_OBJECT
Я получаю строку json из Fitbit API. Я хочу сохранить поля dateTime и value в объекте List. Я использую модуль Джексона kotlin. Для этого я создал класс данных ActivitySteps.
Я не знаю, как избежать поля "действия-шаги", и я застреваю.
Это тело 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 ответа
Вам нужно иметь внешний объект, который соответствует верхнему уровню 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
отлично работает и с Джексоном, если только вы действительно не хотите изменять значения.
Проблема в том, что массив, который вы пытаетесь получить, обернут в объект, который вы вводите в Джексона и запрашиваете список обратно. JSON Object-to-Java List не является переводом, который понимает Джексон, поэтому он задыхается.
Я хотел бы создать класс, который обернет этот список, и попытаться десериализовать его.