2014-12-06 19 views
5

Dati i seguenti datiJava - Jackson matrici nidificate

{ 
    "version" : 1, 
    "data" : [ [1,2,3], [4.5,6]] 
} 

ho provato le seguenti definizioni e utilizzato ObjectMapper.readValue(jsonstring, Outer.class)

class Outer { 
    public int version; 
    public List<Inner> data 
} 

class Inner { 
    public List<Integer> intlist; 
} 

ho ottenuto:

Impossibile deserializzare istanza di interno fuori di token START_ARRAY "

Nella classe esterno, se dico

List<List<Integer> data; 

poi opere di deserializzazione.

Ma nel mio codice, le classi Outer e Inner hanno alcuni metodi relativi alla logica di business e voglio mantenere la struttura di classe.

Capisco che il problema è che Jackson non è in grado di mappare l'array interno alla classe 'Inner'. Devo usare il Tree Model in Jackson? O forse è ancora possibile usare DataModel qui?

risposta

4

Jackson deve sapere come creare un'istanza Inner da un array di ints. Il modo più pulito è dichiarare un costruttore corrispondente e contrassegnare con the @JsonCreator annotation.

Ecco un esempio:

public class JacksonIntArray { 
    static final String JSON = "{ \"version\" : 1, \"data\" : [ [1,2,3], [4.5,6]] }"; 

    static class Outer { 
     public int version; 
     public List<Inner> data; 

     @Override 
     public String toString() { 
      return "Outer{" + 
        "version=" + version + 
        ", data=" + data + 
        '}'; 
     } 
    } 

    static class Inner { 
     public List<Integer> intlist; 

     @JsonCreator 
     public Inner(final List<Integer> intlist) { 
      this.intlist = intlist; 
     } 

     @Override 
     public String toString() { 
      return "Inner{" + 
        "intlist=" + intlist + 
        '}'; 
     } 
    } 

    public static void main(String[] args) throws IOException { 
     final ObjectMapper mapper = new ObjectMapper(); 
     System.out.println(mapper.readValue(JSON, Outer.class)); 
    } 

uscita:

Outer{version=1, data=[Inner{intlist=[1, 2, 3]}, Inner{intlist=[4, 6]}]} 
Problemi correlati