2015-03-06 15 views
5

So che questo può essere semplice. Tuttavia, non riesco a farlo funzionare.Mappa classi JSON nidificate in classi Java con Spring RestTemplate

Quindi sto cercando di utilizzare Spring RestTemplate per mappare i miei dati JSON. Ho seguito la risposta JSON da una chiamata di riposo.

{ 
    "message":"ok", 
    "status":"ok", 
    "data":[ 
     {"Name":"Yo", 
     "Address":"100 Test Rd"}, 
     {...}, 
     {...} 
    ] 
} 

E qui è la classe che sto cercando di mappare a.

@JsonIgnoreProperties(ignoreUnknown = true) 
public class Response implements Serializable { 

    private String message; 
    private String status; 
    private List<Data> data; 

    // I could also use a array instead 
    // private Data[] data; 
} 

Qui è la mia classe di dati:

@JsonIgnoreProperties(ignoreUnknown = true) 
public class Data implements Serializable { 

    private String Name; 
    private String Address; 
} 

Ecco il codice che ho usato per chiamare RestTemplate:

public Reponse getResponse() { 
    ResponseEntity<Reponse> responseEntity = restTemplate.getForEntity(Url, Reponse.class); 

    return responseEntity.getBody(); 
} 

Ora qui viene il problema. Sono stato in grado di ottenere "messaggio" e "stato", ma quando provo a registrare/stampare dati, viene visualizzato null. Non sono proprio sicuro di cosa sta succedendo qui. Potrei davvero usare un po 'di aiuto. Grazie.

+2

Ho lo stesso problema hai trovato una soluzione per questo? – user2137817

+0

Hai trovato qualche soluzione? Grazie. – Fco

risposta

0

Utilizzare private List<Data> data = new AllarList<Data>(); e si prega di fornire i metodi getters() e setters() in entrambe le classi.

Mettere @JsonInclude(Include.NON_EMPTY) suddetta classe di dati

Si prega di aggiungere sotto le dipendenze di cui al punto a vostro file di pom.xml principale e fare compilazione Maven. Quindi immagino che il tuo problema verrà risolto.

 <dependency> 
      <groupId>com.fasterxml.jackson.core</groupId> 
      <artifactId>jackson-annotations</artifactId> 
      <version>2.2.3</version> 
     </dependency> 

     <dependency> 
      <groupId>com.fasterxml.jackson.core</groupId> 
      <artifactId>jackson-databind</artifactId> 
      <version>2.2.3</version> 
     </dependency> 

     <dependency> 
      <groupId>com.fasterxml.jackson.datatype</groupId> 
      <artifactId>jackson-datatype-joda</artifactId> 
      <version>2.1.1</version> 
     </dependency> 

     <dependency> 
      <groupId>org.codehaus.jackson</groupId> 
      <artifactId>jackson-mapper-asl</artifactId> 
      <version>1.8.8</version> 
     </dependency> 
+0

Non ho messo qui setter e getter per evitare confusione. Ho cercato di inizializzare "dati". Ancora restituisce null. Compilare anche l'errore su "Include.NON_EMPTY", "L'inclusione non può essere risolta in una variabile"? Grazie. – Ren

+0

per favore importalo: import com.fasterxml.jackson.annotation.JsonInclude; – sayan

0

Se avete bisogno solo i dati di stampa, è possibile farlo

RestTemplate restTemplate = new RestTemplate(); 
ResponseEntity<String> response = restTemplate.getForEntity(
    "your url", 
    String.class); 

System.out.println(response); 
2

ho avuto un problema simile con RestTemplate non mappare oggetti JSON nidificati al mio modello di classe anche, dopo molta frustrazione ho deciso di recupera il mio JSON come una stringa (invece di convertirlo direttamente al mio oggetto di destinazione) usando RestTemplate e poi uso la libreria di Google Gson per convertire la mia stringa nella mia entità di destinazione.

pom.xml

<dependency> 
     <groupId>com.google.code.gson</groupId> 
     <artifactId>gson</artifactId> 
     <version>2.2.4</version> 
    </dependency> 

codice per chiamare RestTemplate:

ResponseEntity<String> responseEntity = restTemplate.getForEntity(Url,String.class); 
Gson gson = new GsonBuilder().create(); 
Response reponse = gson.fromJson(responseEntity , Response.class); 

Purtroppo non sono riuscito a scoprire perché i miei oggetti nidificati non sono stati mappati usando RestTemplate primo luogo, ma spero che questa soluzione aiuta!

1

Ho riscontrato un problema simile durante la lettura dei dati JSON dall'API REST utilizzando Rest Template. Per risolvere dichiarare getter e setter per la lista:

@JsonIgnoreProperties(ignoreUnknown = true) 
public class Response implements Serializable { 

    private String message; 
    private String status; 
    private List<Data> data; 

// getters and Setters for the list. 


} 

Il RestTemplate mapperà internamente i valori dal ListArray alla matrice corrispondente.

0

Annota proprietà "dati" con @JsonUnwrapped come di seguito

@JsonIgnoreProperties(ignoreUnknown = true) 
public class Response implements Serializable { 
    private String message; 
    private String status; 
    @JsonUnwrapped 
    private List<Data> data; 
} 
0

Ho incontrato lo stesso problema.Annota con @JsonProperty:

@JsonIgnoreProperties(ignoreUnknown = true) 
public class Data implements Serializable { 

    @JsonProperty("Name") 
    private String name; 

    @JsonProperty("Address") 
    private String address; 

    // getters/setters for name and address 

} 

I campi della vostra classe Data dovrebbe ora ottenere popolata, e si può denominare i campi indipendenti della rappresentazione JSON (ad esempio name invece di Name).