2016-05-29 77 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

相关问题