2011-11-24 31 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>>() {});