如果我不知道密钥,如何接受Retrofit响应?

时间:2016-08-14 16:22:22

标签: android json retrofit rx-java

所以,我有一个依赖于路径的API将返回该月的JSON数组,通常格式如下:

{
   "January": []
}

我想写一个Retrofit调用(也使用RxJava,但我觉得无关紧要),但是因为我可能有1月,2月等...我不知道要写什么类。我可以破解这样的事情:

public class JanuaryEvents {
    public List<Events> January;
}

在我的服务中这样做:

@GET("{year}/{month}.json")
Call<JanuaryEvents> getEvents(@Path("year") String year,
                                          @Path("month") String month);

但很明显,如果不创造十二个不同的看似令人讨厌的电话并且必须有一个更好的方式,那么这对所有月份都不会有效。

我该怎么办?

编辑:我刚刚发现,如果我Call<Object>,它会将它分配给LinkedTreeMap,我可以使用它。你认为这是要走的路吗?我可以接受Call<LinkedTreeMap>并从第一个节点获取项目。

2 个答案:

答案 0 :(得分:3)

您可以使用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");
        }
    });

答案 1 :(得分:2)

到目前为止,我提出的最好的方法是使用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());
            }
        });