2017-03-06 50 views
2

数据对象的名单我有一个JSON结构看起来像这样:嵌入式杰克逊

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

我也有

public MyClass { 
    public String mykey; 
} 

现在我想反序列化我的JSON的"data"内容到一个List<MyClass>使用杰克逊,所以我有这个代码:

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

但是,这给了我一个e xception:

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 

任何人都知道我需要做什么才能得到这个解析?

+0

你看过http://stackoverflow.com/questions/6349421/how-to-use-jackson-to-deserialise-an-array-of-objects? – ryuu9187

+0

正在创建一个'data'对象而不是一个选项? – Coder

+0

其实,我的JSON还有一个奇怪之处。它还有一些我需要忽略的东西(“foo”:“bar”)。我想我可以添加一个数据对象,但它感觉相当无用 –

回答

2

更新

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); 

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

+0

是的,一个根对象工作。感谢您的建议。我不必为了使其工作而放入@ JsonProperty/@ JsonInclude/@ JsonPropertyOrder注释中的任何一个,但是我必须添加@JsonIgnoreProperties(“foo”)来解析它,而不用抱怨这个属性不需要阅读。 我仍然有兴趣,如果这可以完成没有根类,但因为它没有任何逻辑价值给我... –

+0

恐怕你必须编写一个自定义的反序列化器在这种情况下。你确定这样的实现吗? – Coder

+0

@DavidBosschaert查看我更新的答案。 – Coder