当前位置: 首页 > 知识库问答 >
问题:

jackson kotlin-无法从START_OBJECT标记反序列化`java.util.ArrayList`实例

诸嘉澍
2023-03-14

我从Fitbit API得到一个json字符串。我想在列表对象中保存dateTime和value字段。我用的是jackson模块Kotlin。我为此创建了ActivitiesSteps数据类。

  {  
   "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)

下面是我使用Jackson的代码:

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]

共有1个答案

濮阳品
2023-03-14

您需要有一个与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

如果希望列表始终存在,可以在Jackson Kotin模块中使用默认值,而且如果需要,也不需要数据类中的var成员,val也可以在Jackson中使用,除非您真的想改变这些值。

 类似资料: