因此,我有一个依赖于路径的API将返回当月的JSON数组,通常格式如下:
{
"January": []
}
我想写一个Retrofit调用(也使用RxJava,但我认为无关紧要),但因为我可以有一月,二月等…我不知道该写什么课。我可以这样修改:
public class JanuaryEvents {
public List<Events> January;
}
在我的服务中这样做:
@GET("{year}/{month}.json")
Call<JanuaryEvents> getEvents(@Path("year") String year,
@Path("month") String month);
但很明显,如果不产生12个不同的呼叫,那么这几个月就行不通了,这看起来很讨厌,必须有更好的方法。
我能做什么?
编辑:我刚刚发现,如果我做Call<Object>
它分配给一个LinkedTreeMap,我可能会工作。你认为这是正确的方法吗?我可以接受Call<LinkedTreeMap>
并从第一个节点获取项目。
您可以使用Response<JsonElement>
:
@GET("{year}/{month}.json")
Call<JsonElement> getEvents(@Path("year") String year, @Path("month") String month);
反应:
call.enqueue(new Callback<JsonElement>() {
@Override
public void onResponse(Call<JsonElement> call, Response<JsonElement> response) {
if(response.isSuccessful()){
JsonElement jsonElement = response.body();
JsonObject objectWhichYouNeed = jsonElement.getAsJsonObject();
//do whatever you want with Json Object. Deserialize it, get values by keys, get as String etc.
}
else{
System.out.println(response.message());
}
}
@Override
public void onFailure(Call<JsonElement> call, Throwable t) {
System.out.println("Failed");
}
});
到目前为止,我想到的最好的方法是使用LinkedTreeMap
,这是我用于改造的gsonconverter的一部分。
服务如下所示:
@GET("{year}/{month}.json")
Call<LinkedTreeMap<String, List<Event>>> getEvents(@Path("year") String year,
@Path("month") String month);
我收到的是这样的:
call.enqueue(new Callback<LinkedTreeMap<String, List<Event>>>() {
@Override
public void onResponse(Call<LinkedTreeMap<String, List<Event>>> call, Response<LinkedTreeMap<String, List<Event>>> response) {
if(response.body().size() == 1) {
for(String key : response.body().keySet()) {
Log.v(LOG_TAG, "Num events: " + response.body().get(key).size());
}
}
}
@Override
public void onFailure(Call<LinkedTreeMap<String, List<Event>>> call, Throwable t) {
Log.v(LOG_TAG, t.getMessage());
}
});