如何从杰克逊的数组开始反序列化JSON文件?

时间:2011-11-24 22:20:20

标签: 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

3 个答案:

答案 0 :(得分:21)

尝试

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

ObjectClass类似于:

  public class ObjectClass {
    String field;

    public ObjectClass() { }

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

注意:在Objects类的发布版本中,您将声明一个列表集合(即列表列表),这不是您想要的。你可能想要一个List<ObjectClass>。但是,在使用Jackson进行反序列化时,只需执行YourObject[].class,然后转换为列表就更简单了。

答案 1 :(得分:6)

您可以通过以下方式直接获取列表:

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

答案 2 :(得分:0)

传递数组或列表类型,就像@dmon一样。

为了完整起见,如果您想逐个阅读内容,还有一种增量方法:

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

如果您有大量的列表或对象序列,这将非常有用;或者包含JSON数组,或者只是用空格或换行符分隔的根级别值。