2011-11-24 23 views
9

我有一個JSON文件看起來像這樣:如何反序列化以Jackson的數組開頭的JSON文件?

[ 
    { "field":"val" }, 
.... 
] 

我代表他們的單個對象和集合Java對象:

public class Objects{ 

    public Collection<List> myObject; 
} 

我想用ObjectMapper反序列化JSON。

ObjectMapper mapper = new ObjectMapper(); 
mapper.readValue(in, Objects.class); 

,但我得到:

11-24 23:19:19.828: W/UpdateService(6084): org.codehaus.jackson.map.JsonMappingException: 
Can not deserialize instance of com.project.my.Objects out of START_ARRAY token 

回答

20

嘗試

mapper.readValue(in, ObjectClass[].class); 

在哪裏對象類是一樣的東西:

public class ObjectClass { 
    String field; 

    public ObjectClass() { } 

    public void setField(String value) { 
     this.field = value; 
    } 
    } 

注:在Objects類的你發佈的版本,你是d掠奪一系列列表(即列表清單),這不是你想要的。你可能想要一個List<ObjectClass>。但是,在用Jackson進行反序列化時,只需執行YourObject[].class,然後再轉換成列表就簡單多了。

0

傳遞數組或列表類型的工作方式,如@dmon回答。

爲了完整起見,還有,如果你想讀的內容一個接一個漸進的方法:

Iterator<Objects> it = mapper.reader(Objects.class).readValues(in); 
while (it.hasNext()) { 
    Objects next = it.next(); 
    // ... process it 
} 

,如果你有巨大的列表或對象的序列這是有用的;要麼封閉JSON數組,要麼僅包含由空格或換行符分隔的根級值。

4

你可以直接得到通過以下方式列表:

List<ObjectClass> objs = 
    mapper.readValue(in, new TypeReference<List<ObjectClass>>() {});