2015-10-08 15 views
5

Pracuję nad parserem JSON dla aplikacji na Androida. Kiedy wywołuję serwer dla danych, jest kilka pól opcjonalnych, jak sobie z tym poradzić w Retroficie przy użyciu konwertera GSON?Jak obsługiwać opcjonalne pola JSON w Retroficie dla Androida?

Normalna reakcja

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

Alternatywny reagowania, gdy niektóre pola nie mają żadnych danych

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

POJO Klasy

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

Jak utworzyć klasy Pojo w sposób na obsługę opcjonalnych pól, które nie są obecne ? W tej chwili cały obiekt MyClassInformation staje się NULL, gdy brakuje pól, proszę o pomoc.

+0

Co próbowałeś/okazałeś? Nie pokazałeś swoich badań, a twoje pytanie z większym prawdopodobieństwem zostanie zamknięte. – Sufian

+0

'@Expose @SerializedName (" klasa-1 ") publiczna SakaiClassInformation sakaiClassInformation;' nie pasuje do żadnej klasy we fragmencie kodu. Czy miałeś na myśli zamiast tego 'MyClassInformation' (czy nazwa' MyClassInformation' została zmieniona na aktualną)? –

+0

Zmieniłem to odpowiednio, przepraszam za literówkę – joelj

Odpowiedz

2

Udało mi się rozwiązać ten problem metodą prób i błędów, udało się uzyskać jego działanie poprzez usunięcie adnotacji @Expose i zmianę konstruktora Gson ... Teraz cały obiekt nie zostanie usunięty lub wykluczony, jeśli brakuje pól i tylko brakujące pola są wyświetlane jako puste.

To właśnie zmieniło, Od

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

Aby

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

Nadzieja pomaga każdemu, kto szuka podobnej odpowiedzi.

0

Walczyłem z tym kilka lat temu.

Prawdopodobnie nie ma na to dobrej odpowiedzi. Przynajmniej nie o tym wiem.

3 opcje rozważane:

  1. Ustaw wszyscy członkowie ponieważ muszą pól (zakładając, że wszystkie one znane z wyprzedzeniem) i ustawić je do Null w przypadku żadna wartość otrzymaliśmy gdzie sens rodzaj makijażu (nie zawsze na przykład sensowne dla typów pierwotnych). Tutaj dodajesz więcej pracy na tych, którzy przekazują ci JSON, ale twój kod java jest prostszy, mniej elastyczny.
  2. Skonfiguruj opcjonalne pola wewnątrz kontenera z parami klucz-wartość, w których klucz i wartość są ciągami. Kontener może być pustą listą, jeśli nie przekazano żadnych opcjonalnych właściwości. Tutaj masz więcej elastyczności, ale musisz pracować ciężej, tworząc niestandardowe serializatory (de).
  3. Użyj kombinacji 1 i 2.

Każda opcja ma wady i zalety, a skończyło się z opcją 3.

Mam nadzieję, że pomoże i powodzenia!

+0

Dzięki, ale udało mi się sprawić, że działało ... zobacz moją odpowiedź – joelj

Powiązane problemy