如何反序列化JSON文件开始与数组在杰克逊



我有一个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

Try

   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,然后转换为列表要简单得多。

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

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

传递数组或列表类型有效,如@dmon所回答的。

为了完整起见,如果您希望逐一读取内容,还有一种增量方法:

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

如果你有庞大的对象列表或序列,这是很有用的;

最新更新