2011-11-24 15 views
9

Ho un file JSON che assomiglia a questo:Come deserializzare il file JSON che inizia con un array in Jackson?

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

ho oggetto Java che rappresenta singolo oggetto e la raccolta di loro:

public class Objects{ 

    public Collection<List> myObject; 
} 

Vorrei deserializzare JSON utilizzando ObjectMapper.

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

ma ottengo:

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 

risposta

20

Prova

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

Dove ObjectClass è qualcosa di simile:

public class ObjectClass { 
    String field; 

    public ObjectClass() { } 

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

Nota: nella versione pubblicata della classe Objects, tu sei d elencando una raccolta di elenchi (ad es. una lista di liste), che non è quello che vuoi. Probabilmente hai voluto un List<ObjectClass>. Tuttavia, è molto più semplice eseguire lo YourObject[].class durante la deserializzazione con Jackson e successivamente la conversione in un elenco.

0

Il passaggio di un array o di un tipo di elenco funziona come risponde @dmon.

Per completezza, v'è anche un approccio incrementale, se si voleva leggere il contenuto uno per uno:

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

Questo è utile se si dispone di elenchi enormi o sequenze di oggetti; con l'array JSON allegato o solo i valori di livello root separati da spazi o linefeed.

4

È possibile ottenere direttamente un elenco attraverso il seguente percorso:

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