質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

1627閲覧

Retrofit2で複数のResponseに対応するやり方を教えてください。

bagi

総合スコア4

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2020/06/27 11:04

編集2020/06/27 11:09

前提・実現したいこと

現在、APIを利用しデータを取得する実装を行っています。
利用しているライブラリはRetrofit2 + Gsonで実装していますが、APIが返すResponseが単一の場合は問題ないのですが、Responseが複数種類ありJson形式が異なる場合、どのように対応すべきかが不明で苦慮しております。
まだ、Android開発を初めてまもなく、開発にあまり知見もなく、Googleでの情報検索でなんとか開発している状態です。
助けていただけると幸いです。

発生している問題

以下のような場合
Response種類1:
public class ApiResultResponse {
public String result;
public List<ApiResultInterface> data;
public String ob;

Response種類2:
public class ApiValidResponse {
public String result;
public List<ApiValiadtionInterface> valid;
public String ob;
}
Response種類3:
public class ApiMaintenanceResponse {
public String result;
public String path;
public String url;
public String ob;
}

処理するJSON種類の判定はresultの内容で判断できればと思っています。
result = "success" の時 ApiResultResponseで受ける
result = "validation" の時 ApivalidResponseで受ける
result = "Maintenance" の時 ApiMaintenanceResponseで受ける

肝心のResponseを切り分ける方法は、色々探したのですがわからずです。
そもそも、Retrofitの呼び出し設定が Call<ApiResultResponse> call = api.ApiResultService();
としており、onResponseの定義も
onResponse(Call<ApiResultResponse> call, Response<ApiResultResponse> response)
となっているため、単一のResponseしか受けられないのだろうと想定はできるのですが、どうすれば良いのかが不明です。

現在のAPI呼分出し方

現在のAPI呼分出しは以下のように行っています。

Gson gson = new GsonBuilder().setLenient().create(); Retrofit retrofit = new Retrofit.Builder() .baseUrl(baseUrl) .addConverterFactory(GsonConverterFactory.create(gson)) .build(); Api api = retrofit.create(Api.class); Call<ApiResultResponse> call = api.ApiResultService(); call.enqueue(this); @Override public void onResponse(Call<ApiResultResponse> call, Response<ApiResultResponse> response) { System.out.println(call.request().url()); if (response.code() == 200){

       //現在は単一ですが、ここでresponse.resultの内容で数種類のResponseとResponseのデータ処理を切り分ける想定
//↓↓↓↓
List<ApiResultInterface> datas = response.body().data;

for (ApiResultInterface items : datas){ //Responseデータ処理 }

       //↑↑↑↑
}
}
@Override
public void onFailure(Call<ApiResultResponse> call, Throwable t) {
Toast.makeText(getApplicationContext(),t.getMessage(),Toast.LENGTH_SHORT).show();
t.printStackTrace();
}

API定義のソースコード

public interface Api {
@GET("data/prefecture")
Call<ApiResultResponse> ApiResultService();
}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

一つAPIが一つResponseだけ対応できますが、三つのResponseを統合するResponseを作ればどうでしょうか?GsonがJSONにないフィールドを無視するらしいです。

java

1public class ApiResultResponse { 2 public String result; 3 public List<ApiResultInterface> data; 4 public String ob; 56 7public class ApiValidResponse { 8 public String result; 9 public List<ApiValiadtionInterface> valid; 10 public String ob; 11} 12 13public class ApiMaintenanceResponse { 14 public String result; 15 public String path; 16 public String url; 17 public String ob; 18} 19 20public class ApiResponse { 21 private String result; 22 private List<ApiResultInterface> data; 23 private List<ApiValiadtionInterface> valid; 24 private String path; 25 private String url; 26 private String ob; 27 28 public ApiResultResponse getApiResultResponse() { 29 assert result == "success"; 30 ApiResultResponse res = new ApiResultResponse(); 31 res.result = this.result; 32 res.data = this.data; 33 res.ob = this.ob; 34 return res; 35 } 36 37 public ApiValidResponse getApiValidResponse() { 38 assert result == "validation"; 39 ApiResultResponse res = new ApiValidResponse(); 40 res.result = this.result; 41 res.valid = this.valid; 42 res.ob = this.ob; 43 return res; 44 } 45 46 public ApiMaintenanceResponse getApiMaintenanceResponse() { 47 assert result == "Maintenance"; 48 ApiResultResponse res = new ApiMaintenanceResponse(); 49 res.result = this.result; 50 res.path = this.path; 51 res.url = this.url; 52 res.ob = this.ob; 53 return res; 54 } 55}

投稿2020/06/27 12:19

編集2020/06/27 12:20
YufanLou

総合スコア464

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bagi

2020/06/27 12:30

なるほど、3つのレスポンスを統合するのですね。 GsonがJSONにないフィールドを無視するのであれば、できそうです。試してみます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問