我有一个看起来像这样的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
答案 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数组,或者只是用空格或换行符分隔的根级别值。