我需要帮助。
我有一个带参数的端点。根据此参数,返回的JSON
将完全不同。
RetroFit
是否可以处理此问题?
例如:
http://myserver.com/all/<parameter>
其中参数为BUS
或BICYCLE
,以及稍后添加其他参数。
示例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类型创建多个不同的方法。
感谢。
答案 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();
}
});