在RetroFit中处理来自同一端点的不同JSON响应类型

时间:2016-02-13 15:25:40

标签: android json retrofit

我需要帮助。

我有一个带参数的端点。根据此参数,返回的JSON将完全不同。

RetroFit是否可以处理此问题?

例如:

http://myserver.com/all/<parameter>

其中参数为BUSBICYCLE,以及稍后添加其他参数。

示例BUS请求将返回:

"stops": [{
    "Lat": "....",
    "Lng": "....",
    "Name": "Main Street",
    "Route": "",
    "StopNumber": "2"
}]

BICYCLE端点将返回:

"stops": [{
    "address": "Town Centre",
    "lat": "....",
    "lng": "....",
    "number": "63",
    "open": "1"
}]

根据用户所在的Android应用的哪个部分,我想发送一个不同的参数,并能够使用相同的调用来处理它。

我正在考虑使用一个名为AllTypes的父类,其他每个类都会扩展,然后将我的Retrofit调用签名设置为:

@GET("/all/{type}")
void getAll(@Path("type") String type, Callback<AllTypes> callback);

但我不确定Retrofit是否可以根据返回的AllTypes或甚至传递的参数JSON自动为type选择正确的子类。< / p>

有谁知道怎么做? 如果没有,我只需要使用不同的Callback类型创建多个不同的方法。

感谢。

2 个答案:

答案 0 :(得分:7)

只是关闭它。

您可以从RetroFit获取原始JSON,并使用GSON手动序列化为您想要的班级类型。

例如:

RestClient.get().getDataFromServer(params, new Callback<JSONObject>() {
    @Override
    public void success(JSONObject json, Response response) {
        if(isTypeA) {
            //Use GSON to serialise to TypeA        
        } else {
            //Use GSON to serialise to TypeB
        }
    }
});

答案 1 :(得分:2)

你可以使用JsonElement如下: 在ApiInterface.java中:

@GET("web api url")
Call<JsonElement> GetAllMyClass();

比MyActivity:

ApiInterface client = ApiClient.getClient().create(ApiInterface.class);

    Call<JsonElement> call = client.GetAllMyClass();
    call.enqueue(new Callback<JsonElement>() {
       @Override
       public void onResponse(Call<JsonElement> call, Response<JsonElement> response) {
                if (response.isSuccessful()) {
                     JsonElement questions = response.body();

 // if response type is array
                     List<MyClass> response_array = new Gson().fromJson(((JsonArray)questions), new TypeToken<List<MyClass>>(){}.getType());

 // if response type is object
                     MyClass response_one = new Gson().fromJson(questions.getAsJsonObject(), MyClass.class);
                 } else {
                      Log.d("MyClassCallback", "Code: " + response.code() + " Message: " + response.message());
                        }
                    }

      @Override
      public void onFailure(Call<JsonElement> call, Throwable t) {
               t.printStackTrace();
       }
    });