嵌入式数据对象列表在杰克逊

时间:2017-03-06 15:40:37

标签: java json jackson

我有一个看起来像这样的JSON结构:

List<MyClass>

我也有

ObjectMapper mapper = new ObjectMapper();
List<MyClass> l = (List<MyClass>) mapper.readerFor(new TypeReference<List<MyClass>>(){}).
    withRootName("data").readValue(myJSONString);

现在我想使用Jackson将我的JSON 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 的内容反序列化为{{1}},所以我有这段代码:

{{1}}

然而,这给了我一个例外:

{{1}}

任何人都知道我需要做些什么来解析它?

1 个答案:

答案 0 :(得分:3)

<强>更新

List<MyClass> l = (List<MyClass>) mapper.readValue(mapper.readTree(myJSONString).findPath("data").toString(),
                                  new TypeReference<List<MyClass>>(){});

这一行将检索您要查找的列表。您尝试执行的操作的问题是,您尝试反序列化data构成JSON的情况,如

{"data":[{"mykey": "someval"}, {"mykey": "someotherval"}]}

但是你的JSON有其他值导致了这个问题。上面的代码使用Jackson JSON树解析器隔离data数组,然后将其取消列表到列表中。

初步回答

拥有一个根对象,以便您可以捕获该对象中的列表。

@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;
}
}

现在使用objectMapper反序列化到此对象。

Root root = mapper.readValue(myJSONString,Root.class);

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