我有一个看起来像这样的JSON结构:
{"data": [{"mykey": "someval"}, {"mykey": "someotherval"}], "foo": "bar"}
Run Code Online (Sandbox Code Playgroud)
我也有
public MyClass {
public String mykey;
}
Run Code Online (Sandbox Code Playgroud)
现在,我想将"data"JSON 的内容反序列化为List<MyClass>使用Jackson,因此我有以下代码:
ObjectMapper mapper = new ObjectMapper();
List<MyClass> l = (List<MyClass>) mapper.readerFor(new TypeReference<List<MyClass>>(){}).
withRootName("data").readValue(myJSONString);
Run Code Online (Sandbox Code Playgroud)
但这给了我一个例外:
com.fasterxml.jackson.databind.JsonMappingException: Unexpected token (FIELD_NAME),
expected END_OBJECT: Current token not END_OBJECT (to match wrapper object with root name
'data'), but FIELD_NAME
Run Code Online (Sandbox Code Playgroud)
有人知道我需要做些什么来解析吗?
更新
List<MyClass> l = (List<MyClass>) mapper.readValue(mapper.readTree(myJSONString).findPath("data").toString(),
new TypeReference<List<MyClass>>(){});
Run Code Online (Sandbox Code Playgroud)
这一行将检索您正在查找的列表。data您想要做的问题是您正在尝试反序列化构成 JSON 的情况,例如
{"data":[{"mykey": "someval"}, {"mykey": "someotherval"}]}
Run Code Online (Sandbox Code Playgroud)
但您的 JSON 有其他值,这导致了问题。上面的代码data使用 Jackson JSON 树解析器隔离数组,然后将其反序列化到列表中。
初步答复
有一个根对象,以便您可以捕获该对象内的列表。
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"data"
})
public class Root {
@JsonProperty("data")
private List<MyClass> data = null;
@JsonProperty("data")
public List<MyClass> getData() {
return data;
}
@JsonProperty("data")
public void setData(List<MyClass> data) {
this.data = data;
}
}
Run Code Online (Sandbox Code Playgroud)
现在使用 objectMapper 反序列化到该对象。
Root root = mapper.readValue(myJSONString,Root.class);
Run Code Online (Sandbox Code Playgroud)
让我知道它是如何工作的。
| 归档时间: |
|
| 查看次数: |
725 次 |
| 最近记录: |