2016-03-28 15 views
1

Dies ist mein Json. Das Problem dabei ist, dass es ein Array als Knoten hat. Ich bin nicht so flüssig mit Retrofit und so habe ich ein paar Probleme zu versuchen, zu verstehen, was los ist und wie es zu beheben ist.Einen JSON mit JsonArray als Root unter Verwendung von Retrofit analysieren

[ 
{ 
    "first_name":"Jakub", 
    "nickname":"", 
    "last_name":"Machalek", 
    "description":"description1", 
    "speaker_id":0, 
    "image_path":"" 
}, 
    { 
    "first_name":"Krzysztof", 
    "nickname":"", 
    "last_name":"Opasik", 
    "description":"Description2", 
    "speaker_id":1, 
    "image_path":"" 
}, 
...etc... 

Wie soll ich es analysieren? Mein aktueller Versuch geht so

POJOs

public class Speaker implements ParentListItem{ 
private String mFirstName; 
private String mNickname; 
private String mLastName; 
private String mDescription; 
private String mImageUrl; 

private ArrayList<Speaker> mChildrenList; 

public Speaker(String mFirstName, String mNickname, String mLastName, String mDescription, String mImageUrl) { 
    this.mFirstName = mFirstName; 
    this.mNickname = mNickname; 
    this.mLastName = mLastName; 
    this.mDescription = mDescription; 
    this.mImageUrl = mImageUrl; 
    mChildrenList = new ArrayList<>(); 
    mChildrenList.add(this); 
} 

public String getFirstName() { 
    return mFirstName; 
} 

public void setFirstName(String mFirstName) { 
    this.mFirstName = mFirstName; 
} 

public String getNickname() { 
    return mNickname; 
} 

public void setNickname(String mNickname) { 
    this.mNickname = mNickname; 
} 

public String getLastName() { 
    return mLastName; 
} 

public void setLastName(String mLastName) { 
    this.mLastName = mLastName; 
} 

public String getDescription() { 
    return mDescription; 
} 

public void setDescription(String mDescription) { 
    this.mDescription = mDescription; 
} 

public String getImageUrl() { 
    return mImageUrl; 
} 

public void setImageUrl(String mImageUrl) { 
    this.mImageUrl = mImageUrl; 
} 

@Override 
public List<?> getChildItemList() { 
    return mChildrenList; 
} 

@Override 
public boolean isInitiallyExpanded() { 
    return false; 
} 

Und

public class SpeakerList { 

List<Speaker> speakerList; 


public List<Speaker> getSpeakerList() { 
    return speakerList; 
} 

public void add(Speaker nataCenterItem){ 
    if(speakerList == null){ 
     speakerList = new LinkedList<>(); 
    } 
    speakerList.add(nataCenterItem); 
} 

Retrofit public class SessionInfoService { privaten SessionInfoApi sessionInfoApi;

public SessionInfoService(){ 
    Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl("...") 
      .addConverterFactory(GsonConverterFactory.create()) 
      .build(); 
    sessionInfoApi = retrofit.create(SessionInfoApi.class); 
} 

public void getLectureList(Callback callback) throws IOException { 
    sessionInfoApi.getLectureList().enqueue(callback); 
} 

public void getSpeakerList(Callback callback) throws IOException { 
    sessionInfoApi.getSpeakerList().enqueue(callback); 
} 

Schnittstelle

@GET("...") 
Call<List<Speaker>> getSpeakerList(); 

konnte ich jede Hilfe gebrauchen.

+0

Ich habe die Antwort unten akzeptiert. Entschuldigung für die Verspätung. Ich war ein gelegentlicher Benutzer. Jetzt fange ich an, SO öfter bei meinem Job zu benutzen. – sp0rk

Antwort

0

Von dem was ich sagen kann alles sieht gut aus außer Sie haben etwas in Ihrem Speaker Modell verpasst. Wenn Sie Ihre Retrofit-Instanz eingerichtet haben, verwenden Sie den Konverter gson. Standardmäßig gson serialisiert und deserialisiert die jsons, indem der Schlüssel im json betrachtet und versucht wird, das Attribut des Java-Objekts mit demselben Namen zu setzen.

In Ihrem Fall versucht es zum Beispiel für das Attribut first_name in Ihrem Speaker Modell, das Sie nicht haben, da es mFirstName ist. Ohne weitere Unterstützung kann gson nicht wissen, welches Feld in Ihrem Modell eingestellt werden soll.

Eine naheliegende Möglichkeit, dies zu beheben, ist, Ihr Feld first_name zu benennen. Dies ist jedoch nicht die gängigste oder gewünschte Methode zum Benennen von Feldern in Java. Daher bietet Ihnen gson die SerializedName Annotation. Es teilt im Wesentlichen mit, auf welches Feld in dem JSON sich das Feld in dem Java-Objekt bezieht. Also, wenn Sie Ihr Speaker Modell schreiben würde wie:

public class Speaker implements ParentListItem{ 
    @SerializedName("first_name") 
    private String mFirstName; 
    @SerializedName("nickname") 
    private String mNickname; 
    @SerializedName("last_name") 
    private String mLastName; 
    // ... 
} 

dann weiß gson die die json einzustellen Felder und zu verwenden deserialisieren und serialisiert werden soll. Der Retrofit-Aufruf sieht gut aus. Ich denke, Sie können das SpeakerList Modell ignorieren und das List<Speaker> verwenden, wie Sie haben. Sie können auch die Expose Annotation verwenden. Es ist nicht unbedingt notwendig, aber möglicherweise erforderlich. Aus der Dokumentation:

Diese Anmerkung hat keine Auswirkung, wenn Sie Gson mit einem GsonBuilder und rufen GsonBuilder.excludeFieldsWithoutExposeAnnotation() -Methode bauen.

+0

Vielen Dank. Ich war ein gelegentlicher SO-Benutzer, also brauchte ich eine Weile, um diese Antwort zu akzeptieren, aber wie ich mich erinnern kann, war genau das das Problem. Danke für deine Antwort Mann :) – sp0rk

Verwandte Themen