前提・実現したいこと
現在、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();
}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/27 12:30