杰克逊中嵌入的数据对象列表

Dav*_*ert 5 java json jackson

我有一个看起来像这样的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)

有人知道我需要做些什么来解析吗?

Cod*_*der 4

更新

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)

让我知道它是如何工作的。