2016-05-29 5 views
1

Iは、イベントテーブル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 
} 

会場フィールドはこのフォーマットを有する会場のテーブルへの外部キーであるため、このJSONを出力するAPIエンドポイントを有します。

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

イベントのリストを取得した後、私は(私はすでにリストを取得し、アダプタを使用する方法を知ることができる)recyclerviewにそれらを取得したいと思いますが、私は会場の{IDを表示したくありません}、私は会場の{名前}を使いたいです。これはどうすればいいですか?それはネストされたJSONがどのように非直列化されるかに関連していますか?

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

ますのでご注意ください

{ 
    "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を使用しているので、あなたは以下のモデルを持っているしたいと思う:私は今、あなたのような何かを持っていることを前提としていますすべてのコメントの後

+0

に依存私はいくつかの質問をして、私は助けることができるかもしれません。 GsonでRetrofitを使用していますか?あなたの残りのAPIは実際に上記のjsonsを返すのですか、それともシリアライゼーションの結果ですか?つまり、サーバーがネストされたjsonを送信しない可能性がありますか?あなたはすでにいくつかのモデルを持っていますか? – Fred

+0

はいGsonで改造を行っています。残りのAPIは上記のようにjsonを返します。それは入れ子のjsonを送信しません。 – zacmwa

+0

[OK]を、改造はあなたのために箱の中でこれを行うことはありません。 2つのオプションがあります。最初の呼び出しでいくつかのパラメータがサポートされているかどうかを調べるか、応答に '' venue'' jsonも含める必要があることをサーバに伝えるヘッダがあります。もしそうなら、助けがより簡単になります。そうでなければ、あなたはあなたがその会場のIDをどのように得ることができるかを知る必要があります。なぜなら、ほとんどの場合、別の休憩をとる必要があるからです。私は最初のアプローチで、最初の呼び出しの応答に ''会場 ''のボディを含めることができるかどうかを試してみようと思います。私に教えてください、私はあなたをさらに助けるでしょう。 – Fred

答えて

1

私はここでいくつかのデータ型、すなわちlatitudelongitudeと同様にevent_typeと仮定しています。 jsonで彼らはnullだったので、私は本当に確信できませんでしたが、私はあなたがこの例から理解できると思います。適切なゲッタとセッタを追加してください。

venueに注目してください。ご覧のとおり、私は基本的にJavaオブジェクトの中に "入れ子になった" jsonの部分を作り直しています。それだけで、Gsonretrofitがあなたのために残ります。方法は次のとおりです。注意の言葉 - これは、あなたが物事をどのようにしているかによって多少異なる場合があります。私はrxjavaが好きですが、ここでは説明しやすいので、ここでコールバックの方法を使用します。すべてはあなたがVenueオブジェクトが返されるJSONを提供するアクセスすることができEventのインスタンスを取得しますあなたのコールバックのsuccess方法で、うまくいけ提供

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

レトロフィットを行うことができます1.9実際は上記のものです。

レトロフィットインターフェースは少し変わりますが、基本的にそれは前と同じ考えです:あなたいったんenqueue要求とは、あなたもあなたの成功にEventオブジェクトを取得しますCallbackオブジェクトを定義

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

メソッドは、会場への参照を持つでしょう。ここで(。少し改造バージョン間で変更される可能性があり、私は完全には覚えていない)これらのコールバックは、レトロフィットで実装されるかもしれない方法は次のとおりです。ここで

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をデサライズすることができましたが、会場名をテキストビューにバインドする際に問題が発生しました。このようなテキストを設定しようとするとネストされた応答を取得した後:holder.eventVenueTextView.setText(event.getVenue()。getName())、私は上の行を指すjava.lang.NullPointerExceptionを取得します。非ネストされたフィールドはうまく動作しています。動作していない会場名だけです。私はあなたの他のステップに従っていました。私はレトロフィットでレスポンスを記録すると、会場のあるレスポンスを見ることができます – zacmwa

+0

ちょっと質問を更新したり、コードを持っているリンクを教えてください。私は、Javaモデルとjsonの間に小さな相違があるかもしれないと推測しています。また、新しいjsonレスポンスを置くことができれば、非常に役に立ちます。 – Fred

+0

ありがとうございます。問題を解決できました。私はコンバータの工場を追加していないが、私はすべてうまくいった。 – zacmwa

関連する問題