2016-05-29 78 views
1

我有一個API端點,輸出此JSON的事件表如何使用Retrofit和Gson獲取外鍵的字段?

{ 
    "name": "", 
    "time": null, 
    "event_pic_url": null, 
    "description": "", 
    "event_type": null, 
    "invite_only": false, 
    "free": false, 
    "age_restriction": false, 
    "ticket_price": null, 
    "venue": null 
} 

會場場是一個外鍵,它具有這種格式的場地表。

{ 
    "name": "", 
    "rating": null, 
    "longitude": null, 
    "latitude": null 
} 

獲得事件列表後,我想,讓他們在recyclerview(我已經可以獲取列表並知道如何使用適配器),但我不想顯示會場的{ID },我想使用場地的{名稱}。我該怎麼做呢?它與嵌套的json如何反序列化有關?

+0

取決於...我有幾個問題,那麼我可能會提供幫助。你是否在使用Gson的Retrofit?你的休息api實際上是返回上面的jsons,還是序列化的結果?我的意思是,服務器是否可能不會向您發送嵌套的json?你已經有一些模型? – Fred

+0

是的,我正在使用Gson改造。其他api返回json,如上所示。它不會發送嵌套的json。 – zacmwa

+0

好的,改造不會爲你開箱即用。你有2個選項,看看第一個調用是否支持一些參數,或者是頭部會告訴服務器他應該在響應中包含''venue'' json。如果是這樣,那麼幫助會更容易。如果沒有,那麼你必須找出你如何獲得該場所的ID,因爲很可能你必須再打一次休息電話。我會採用第一種方法,試着弄清楚在第一個電話的回覆中是否可以包含場地的身體。讓我知道,我會進一步幫助你。 – Fred

回答

1

所有我會假設你現在有什麼樣的意見後:

{ 
    "name": "", 
    "time": null, 
    "event_pic_url": null, 
    "description": "", 
    "event_type": null, 
    "invite_only": false, 
    "free": false, 
    "age_restriction": false, 
    "ticket_price": null, 
    "venue": { 
    "name": "", 
    "rating": null, 
    "longitude": null, 
    "latitude": null 
    } 
} 

由於您使用Gson,你會希望有以下型號

public class Venue { 

    @SerializedName("name") 
    @Expose 
    private String name; 
    @SerializedName("rating") 
    @Expose 
    private Integer rating; 
    @SerializedName("longitude") 
    @Expose 
    private Double longitude; 
    @SerializedName("latitude") 
    @Expose 
    private Double latitude; 

    // ... 
} 

public class Event { 

    @SerializedName("name") 
    @Expose 
    private String name; 
    @SerializedName("time") 
    @Expose 
    private String time; 
    @SerializedName("event_pic_url") 
    @Expose 
    private String eventPicUrl; 
    @SerializedName("description") 
    @Expose 
    private String description; 
    @SerializedName("event_type") 
    @Expose 
    private String eventType; 
    @SerializedName("invite_only") 
    @Expose 
    private Boolean inviteOnly; 
    @SerializedName("free") 
    @Expose 
    private Boolean free; 
    @SerializedName("age_restriction") 
    @Expose 
    private Boolean ageRestriction; 
    @SerializedName("ticket_price") 
    @Expose 
    private Double ticketPrice; 
    @SerializedName("venue") 
    @Expose 
    private Venue venue; 
    // ... 
} 

請注意我在這裏假設了一些數據類型,即latitudelongitude以及event_type。由於在json中他們是null我無法確定,但我想你可以從這個例子中理解。也請添加適當的獲取者和設置者。

我希望您專注於venue部分。正如你看到的,我基本上是在Java對象中重新創建「嵌套」的json部分。這就是它,Gsonretrofit將爲你做其餘的。就是這樣。一個謹慎的詞 - 這可能會有很大的不同,這取決於你如何做事。我更喜歡rxjava,但我會在這裏使用回調方法,因爲它更容易解釋。

改造1.9你可以這樣做:

public interface EventService { 
    @GET("/url/to/events/endpoint/") 
    public void get(Callback<Event> callback); 
} 

提供一切順利的話,在你的回調success方法,你會得到的Event這樣的情況:你可以訪問Venue對象提供返回的JSON實際上是上面的那個。

改造界面改變了一點,但它本質上是相同的思路前:

public interface EventService { 
    @GET("/url/to/events/endpoint/") 
    public Call<Event> get(); 
} 

一旦你enqueue的要求和定義Callback對象,你會在你成功得到Event對象方法可以參考一個場地。下面是這些回調可能與改造實現(可能會略有改進版本之間的變化我不完全記):

eventService.get().enqueue(new Callback<Event>() { 
    @Override public void onResponse(Call<Event> call, Response<Event> response) { 
    if (!response.isSuccessful()) { 
     // Handle http error 
     return; 
    } 

    Event event = response.body(); 
    Venue venue = event.getVenue(); 

    // do something with it 
    } 

    @Override public void onFailure(Call<Event> call, Throwable t) { 
    // Handle error 
    } 
}); 
} 

這裏eventServiceRetrofit.create(EventService.class)創建的對象。

再次改裝位可能會改變,具體取決於您要使用的方法。重要的是要了解如何從json響應映射到java對象,基本上你只需要複製相同的json結構,但在java對象中。希望能幫助到你。

+0

嗨。我能夠更改我的翻新代碼,以便可以對嵌套的json進行desrialize,但是現在我遇到了將場所名稱綁定到textview的問題。當我嘗試設置這樣的文本時獲得嵌套響應:holder.eventVenueTextView.setText(event.getVenue()。getName()),我得到一個java.lang.NullPointerException,它指向上面的行。非嵌套字段工作正常,它只是場地名稱不起作用。我遵循你的其他步驟,當我在改進中記錄響應時,我可以看到有迴應的場地 – zacmwa

+0

嘿,你可能會更新你的問題或指向我的鏈接,你有你的代碼?我猜測在java模型和json之間可能會有一個小的差異。如果您也可以放置新的json響應,這也會非常有幫助。 – Fred

+0

Thanks.I能夠解決這個問題。我沒有添加轉換器工廠,但是當我一切工作正常。 – zacmwa

相關問題