2015-10-08 8 views
5

Ich arbeite an einem JSON-Parser für eine Android-Anwendung. Wenn ich den Server für Daten anrufe, gibt es einige optionale Felder, wie gehe ich in Retrofit mit GSON Konverter um?Wie behandelt man optionale JSON-Felder in Retrofit für Android?

Normale Antwort

{ 
    "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" 
    } 
} 

Alternative Antwort, wenn einige Felder haben keine Daten

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

POJO Klassen

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; 
} 

Wie erstelle ich die POJO Klassen in eine Möglichkeit, mit den optionalen Feldern umzugehen, die nicht vorhanden sind ? Im Moment wird das gesamte MyClassInformation-Objekt NULL, wenn Felder fehlen, bitte helfen.

+0

Was haben Sie versucht/herausgefunden? Sie haben Ihre Recherche nicht angezeigt und Ihre Frage wird wahrscheinlich eher geschlossen. – Sufian

+0

'@Expose @SerializedName (" class-1 ") public SakaiClassInformation sakaiClassInformation;' stimmt mit keiner Klasse in Ihrem Code-Snippet überein. Wussten Sie vielleicht, dass Sie stattdessen "MyClassInformation" haben (oder "MyClassInformation" in das umbenannt haben, was Sie gerade haben)? –

+0

Ich habe es entsprechend geändert, sorry nur ein Tippfehler – joelj

Antwort

2

Ich habe es geschafft, dies durch Versuch und Irrtum zu lösen, schaffte es durch Entfernen der @ Expose Annotation und Ändern des Gson Konstruktors ... Jetzt wird das ganze Objekt nicht Nulled oder ausgeschlossen, wenn Felder fehlen und nur die fehlende Felder werden als null angezeigt.

Dies ist, was ich geändert, Von

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

Um

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

Hoffe, dass es jemand hilft, die für eine ähnliche Antwort sucht.

0

Ich kämpfte mit diesem Paar von Jahren.

Wahrscheinlich gibt es dafür keine gute Antwort. Zumindest nicht, dass ich mir dessen bewusst bin.

3 Optionen in Betracht gezogen:

  1. Sets all Mitglieder als Must-Felder (vorausgesetzt, sie alle im Voraus bekannt) und stellen sie keinen Wert empfangen zu Null in Fall, in dem die Art Sinn (es ist nicht immer tut zB für primitive Typen sinnvoll). Hier setzen Sie mehr auf diejenigen, die Ihnen den JSON übergeben, aber Ihr Java-Code ist einfacher, jedoch weniger flexibel.
  2. Legen Sie die optionalen Felder in einem Container mit Schlüssel/Wert-Paaren fest, wobei der Schlüssel und der Wert Strings sind. Der Container kann eine leere Liste sein, wenn keine optionalen Eigenschaften übergeben wurden. Hier haben Sie mehr Flexibilität, müssen aber härter arbeiten, um benutzerdefinierte (De-) Serialisierer zu erstellen.
  3. eine Kombination aus 1 und 2. Verwenden Sie

Jede Option Vor-und Nachteile hat und ich mit der Option 3.

Hoffe, es hilft und viel Glück am Ende!

+0

Danke, aber ich schaffte es zu arbeiten ... sehe meine Antwort – joelj

Verwandte Themen