2016-03-02 11 views
21

Nel mio progetto Android ho due tipi di risposta in cui entrambe le risposte sono identiche tranne due chiavi.Gson - Leggere un valore con due chiavi diverse

Risposta 1

{"fullName":"William Sherlock Scott Holmes","address":"221B Baker Street, London, England, UK","downloads":642,"rating":3,"repos":["https://link1","https://link2","https://link3"]} 

Response 2

{"name":"Sherlock","city":"London","downloads":642,"rating":3,"repos":["https://link1","https://link2","https://link3"]} 

Se vedete le risposte solo due nomi di chiave stanno cambiando fullName/nome e indirizzo/città

I don Voglio creare un altro pojo per altre risposte. Ora la mia domanda è la, è possibile utilizzare solo un Pojo per leggere entrambe le risposte.

public class AccountInfo { 
    private String name; 
    private String city; 
    //other objects 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getCity() { 
     return city; 
    } 

    public void setCity(String city) { 
     this.city = city; 
    } 
    //other setters and getters 
} 

Qualsiasi aiuto sarà apprezzato ...

+2

fare quei campi aggiuntivi getter e setter, se il campo getter è vuota non lo farà creare qualsiasi problema Prova questo e fammi sapere se posso aiutarti con qualcos'altro –

+1

@Rakshit grazie. controlla la risposta di Doug Stevenson .. – Bharatesh

risposta

37

È possibile annotare i membri di accettare i valori da due nomi diversi JSON utilizzando il @SerializedName della nota:

@SerializedName(value = "name", alternate = {"fullName"}) 
private String name; 
@SerializedName(value = "city", alternate = {"address"}) 
private String city; 

O elemento denominato può essere inserito nelle membra che sono annotati in questo modo.

aggiornamento: @SerializedName nomi alternativi quando si aggiunge la deserializzazione in Version 2.4

+0

Grazie amico .... – Bharatesh

+0

ottenere java.lang.IllegalArgumentException: Impossibile creare il convertitore per la classe –

0

Sì che si può fare in un solo POJO. Prova questo:

public class POJO { 

@SerializedName("name") 
public String name; 

@SerializedName("city") 
public String city; 

@SerializedName("fullName") 
public String fullName; 

@SerializedName("address") 
public String address; 

@SerializedName("downloads") 
public Integer downloads; 

@SerializedName("rating") 
public Integer rating; 

@SerializedName("repos") 
public List<String> repos = new ArrayList<String>(); 

} 

Durante l'analisi si controlla i valori per nulla. Per esempio -

durante l'analisi di risposta 1: nome e città variabili saranno nulli

durante l'analisi Risposta 2: FullName e indirizzo sarà nullo

Nota: Prova a controllare valori per null prima di utilizzare altrimenti riceverai nullpointerexception

+0

Grazie mille ... @Doug La risposta di Stevenson è più completa perché non devo controllare per 'null'. – Bharatesh

+0

Cattivo approccio per fare questo –

1

Sì, si può assolutamente utilizzare una classe POJO per deserializzazione entrambe le risposte. La tua classe POJO conterrà le chiavi di entrambe le risposte.

public class Response { 


private String name; 
private String city; 
private String fullName; 
private String address; 
private Integer downloads; 
private Integer rating; 
private List<String> repos ; 

} 

Ma quando si utilizza la classe Response, fare attenzione che per prima risposta, il nome e città sarà nulla, e per la secondo, l'indirizzo e nome completo.

0

Definire tutti i possibili campi della classe POJO come

public class AccountInfo { 
     private String name; 
     private String city; 
     private String fullname; 
     private String address; 
    } 

Durante l'esecuzione di controllo del funzionamento per nulla in quei feilds

+0

bene. grazie per la risposta ... Ma non hai controllato che altre risposte siano le stesse che hai risposto ... – Bharatesh

Problemi correlati