2017-03-06 79 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