Как десериализовать файл JSON, начинающийся с массива в Джексоне? - PullRequest
15 голосов
/ 25 ноября 2011

У меня есть файл Json, который выглядит следующим образом:

[
    { "field":"val" },
....
]

У меня есть Java-объект, представляющий один объект, и их коллекция:

public class Objects{

    public Collection<List> myObject;
}

Я бы хотел десериализовать JSON, используя ObjectMapper.

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 ]

22 голосов
/ 25 ноября 2011

Попробуйте

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

Где ObjectClass выглядит примерно так:

  public class ObjectClass {
    String field;

    public ObjectClass() { }

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

Примечание. В опубликованной версии класса Objects вы объявляете коллекцию списков (т.е. список списков), что не то, что вы хотите.Вы, вероятно, хотели List<ObjectClass>.Однако гораздо проще сделать YourObject[].class при десериализации с Джексоном, а затем преобразовать в список.

6 голосов
/ 23 апреля 2013

Вы можете напрямую получить список следующим образом:

List<ObjectClass> objs =  
    mapper.readValue(in, new TypeReference<List<ObjectClass>>() {});
0 голосов
/ 25 ноября 2011

Передача массива или типа List работает, как ответил @dmon.

Для полноты картины существует также поэтапный подход, если вы хотите читать содержимое по одному:

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

Это полезно, если у вас есть огромные списки или последовательности объектов; либо с включенным массивом JSON, либо с просто значениями корневого уровня, разделенными пробелами или переводами строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...