2011-11-24 24 views
9

tengo un archivo JSON que tiene este aspecto:¿Cómo deserializar el archivo JSON comenzando con una matriz en Jackson?

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

tengo objeto de Java que representa solo objeto y colección de ellos:

public class Objects{ 

    public Collection<List> myObject; 
} 

me gustaría deserializar JSON usando ObjectMapper.

ObjectMapper mapper = new ObjectMapper(); 
mapper.readValue(in, Objects.class); 

pero me sale:

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 

Respuesta

20

Trate

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

Dónde ObjectClass es algo así como:

public class ObjectClass { 
    String field; 

    public ObjectClass() { } 

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

Nota: en la versión publicada de la clase Objects, tu rojo eclaring una Colección de Listas (es decir una lista de listas), que no es lo que quieres. Probablemente querías un List<ObjectClass>. Sin embargo, es mucho más simple hacer YourObject[].class al deserializar con Jackson y luego convertirlo en una lista.

0

Pasar una matriz o Tipo de lista funciona, como @dmon respondió.

Para mayor abundamiento, hay también un enfoque incremental si desea leer el contenido de uno en uno:

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

Esto es útil si usted tiene enormes listas o secuencias de objetos; ya sea con encerrar JSON Array, o solo valores de nivel raíz separados por espacios o avances de línea.

4

Usted puede obtener directamente una lista a través de la siguiente manera:

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