如何使用Jackson反序列化以数组开头的JSON文件?

24

我有一个长这样的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个回答

29

尝试一下

   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,然后再转换为列表会更简单。


8
您可以通过以下方式直接获取列表:
List<ObjectClass> objs =  
    mapper.readValue(in, new TypeReference<List<ObjectClass>>() {});

0

传递数组或列表类型是可行的,就像@dmon所回答的那样。

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

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

如果您有大量的对象列表或序列,这将非常有用;无论是带有封闭JSON数组,还是仅由空格或换行符分隔的根级值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接