2016-03-28 62 views
1

這是我的Json。問題在於它有一個數組作爲節點。我並不是那麼流利地使用Retrofit,所以我在試圖理解正在發生的事情以及如何解決它時遇到了一些問題。使用Retrofit解析Json和JsonArray作爲根

[ 
{ 
    "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... 

我該如何解析它?我現在的嘗試是這樣的

的POJO

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

而且

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

改造 公共類SessionInfoService { 私人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); 
} 

接口

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

我可以使用任何幫助。

+0

我已經接受了下面的答案。抱歉耽擱了。我是偶爾的用戶。現在我開始在工作中更頻繁地使用SO了。 – sp0rk

回答

0

從我可以告訴所有看起來不錯,除非你錯過了你的Speaker模型中的東西。所以,當你設置你的改造實例時,你使用的是gson轉換器。默認情況下,gson通過查看json中的鍵並嘗試設置具有相同名稱的java對象的屬性來序列化和反序列化jsons。

對於您的情況,它會嘗試在您的Speaker模型中查找屬性first_name的示例,因爲它的格式爲mFirstName,所以您沒有該模型。因此,如果沒有任何進一步的幫助,gson實際上無法知道在您的模型中設置哪個字段。

解決此問題的一個顯而易見的方法是命名您的字段first_name。但是,這不是用Java命名域的最常用或最理想的方式,因此gson爲您提供了SerializedName註釋。它基本上告訴json中的哪個字段與Java對象中的字段相關。所以,如果你寫你的Speaker模型:

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

然後gson知道哪些字段設置和使用並行化和串行的JSON。 Retrofit呼籲看起來不錯。我想你可以忽略SpeakerList模型,並像你一樣使用List<Speaker>

你可能會考慮使用Expose Annotation。這不是絕對必要的,但可能需要。從文檔:

除非您使用GsonBuilder構建Gson並調用GsonBuilder.excludeFieldsWithoutExposeAnnotation()方法,否則此註釋不起作用。

+0

謝謝。我是一位超級用戶,所以花了我一段時間才接受這個答案,但正如我記得這正是問題所在。謝謝你的回答人:) – sp0rk