jackson kotlin - 无法从 START_OBJECT 令牌中反序列化 `java.util.ArrayList` 的实例
jackson kotlin - Cannot deserialize instance of `java.util.ArrayList` out of START_OBJECT token
我从 Fitbit API 收到一个 json 字符串。我想将日期时间和值字段保存在 List 对象中。我正在使用 jackson 模块 kotlin。我为此创建了 ActivitiesSteps 数据 class。
我不知道如何避免 "activities-steps" 字段,我被卡住了。
这是 JSON 正文(在下面代码中的变量 'jsonSteps' 中提供给 readValue 方法):
{
"activities-steps":[
{
"dateTime":"2018-04-17",
"value":"11045"
},
{
"dateTime":"2018-04-18",
"value":"14324"
},
{
"dateTime":"2018-05-16",
"value":"11596"
}
]
}
这里是我的 class 保存我的数据:
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]
问题是您尝试获取的数组包含在一个对象中,您将其输入 Jackson 并要求返回一个 List。 JSON object-to-Java List 不是 Jackson 理解的翻译,所以令人窒息。
我会创建一个 class 来包装该列表并尝试反序列化。
您需要有一个与 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 模块的默认值,并且如果您愿意,也不需要数据 class 中的 var
成员,val
与 Jackson 一起工作也很好,除非你真的想改变这些值。
我从 Fitbit API 收到一个 json 字符串。我想将日期时间和值字段保存在 List 对象中。我正在使用 jackson 模块 kotlin。我为此创建了 ActivitiesSteps 数据 class。
我不知道如何避免 "activities-steps" 字段,我被卡住了。
这是 JSON 正文(在下面代码中的变量 'jsonSteps' 中提供给 readValue 方法):
{
"activities-steps":[
{
"dateTime":"2018-04-17",
"value":"11045"
},
{
"dateTime":"2018-04-18",
"value":"14324"
},
{
"dateTime":"2018-05-16",
"value":"11596"
}
]
}
这里是我的 class 保存我的数据:
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]
问题是您尝试获取的数组包含在一个对象中,您将其输入 Jackson 并要求返回一个 List。 JSON object-to-Java List 不是 Jackson 理解的翻译,所以令人窒息。
我会创建一个 class 来包装该列表并尝试反序列化。
您需要有一个与 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 模块的默认值,并且如果您愿意,也不需要数据 class 中的 var
成员,val
与 Jackson 一起工作也很好,除非你真的想改变这些值。