2015-10-08 14 views
5

Sto lavorando su un parser JSON per un'applicazione Android. Quando chiamo il server per i dati, ci sono alcuni campi opzionali, come posso gestirlo in Retrofit usando il convertitore GSON?Come gestire i campi JSON opzionali in Retrofit per Android?

risposta Normale

{ 
    "status":"SUCCESS", 
    "class-1":{ 
     "class.enddate":"Jan/10/2016", 
     "class.startdate":"Jan/10/2015", 
     "class.title":"Physics 1", 
     "class.short.description":"Physics 1", 
     "class.description":"This is a Physics Class" 
    } 
} 

risposta alternativo, quando alcuni campi non hanno alcun dato

{ 
    "status":"SUCCESS", 
    "class-1":{ 
    "class.enddate":"Jan/10/2016", 
    "class.startdate":"Jan/10/2015", 
    "class.title":"Physics 1" 
    } 
} 

classi POJO

public class MyClass { 
    @Expose @SerializedName("status") 
    public String status; 

    @Expose @SerializedName("class-1") 
    public MyClassInformation myClassInformation; 
} 

public class MyClassInformation { 
    @Expose @SerializedName("class.title") 
    public String classTitle; 

    @Expose @SerializedName("class.short.description") 
    public String classShortDescription; 

    @Expose @SerializedName("class.description") 
    public String classDescription; 

    @Expose @SerializedName("class.startdate") 
    public String startDate; 

    @Expose @SerializedName("class.enddate") 
    public String endDate; 
} 

Come faccio a creare le classi POJO in un modo per gestire i campi opzionali non presenti ? Al momento l'intero oggetto MyClassInformation diventa NULL quando mancano i campi, per favore aiuto.

+0

Che cosa hai provato/trovato? Non hai mostrato la tua ricerca e la tua domanda è più probabile che finisca per essere chiusa. – Sufian

+0

'@Expose @SerializedName (" class-1 ") pubblico SakaiClassInformation sakaiClassInformation;' non corrisponde ad alcuna classe nel tuo snippet di codice. Forse intendevi avere "MyClassInformation" lì (o avere "MyClassInformation" rinominato in quello che hai attualmente)? –

+0

L'ho modificato di conseguenza, mi dispiace solo un refuso – joelj

risposta

2

Sono riuscito a risolverlo per tentativi ed errori, sono riuscito a farlo funzionare rimuovendo l'annotazione @Expose e cambiando il costruttore Gson ... Ora l'intero oggetto non viene annullato o escluso se mancano campi e solo il i campi mancanti vengono visualizzati come null.

Questo è quello che ho cambiato, Da

Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create(); 

Per

Gson gson = new GsonBuilder().create(); 

Speranza che aiuta chiunque, che è alla ricerca di una risposta simile.

0

Ho faticato con questo paio di anni fa.

Probabilmente non c'è una buona risposta per questo. Almeno non che io sappia.

3 opzioni considerate:

  1. impostare tutti i membri come must-campi (ammesso che tutti noti in anticipo) e metterli a Null nel caso in cui nessun valore ha ricevuto in cui il tipo ha senso (non sempre per esempio, ha senso per i tipi primitivi). Qui metti più lavoro su quelli che ti passano il JSON ma il tuo codice java è più semplice tuttavia, meno flessibile.
  2. Imposta i campi facoltativi all'interno di un contenitore di coppie chiave-valore in cui la chiave e il valore sono stringhe. Il contenitore può essere una lista vuota se non sono state passate proprietà facoltative. Qui hai più flessibilità, ma devi lavorare più duramente per creare serializzatori (de) personalizzati.
  3. utilizzano una combinazione di 1 e 2.

Ogni opzione ha i suoi pro e contro e ho finito con l'opzione 3.

speriamo vi sia utile e buona fortuna!

+0

Grazie, ma sono riuscito a farlo funzionare ... vedi la mia risposta – joelj

Problemi correlati