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



因此,我有一个依赖于路径的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());
            }
        });

相关内容

  • 没有找到相关文章

最新更新