【问题标题】:How to accept a Retrofit response if I don't know the key?如果我不知道密钥,如何接受改造响应?
【发布时间】:2016-12-21 00:21:00
【问题描述】:

所以,我有一个依赖于路径的 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);

但显然,如果不创建 12 个不同的调用,这将无法持续几个月,这看起来令人讨厌,必须有更好的方法。

我能做什么?

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

【问题讨论】:

  • 看看谁在这里吧?你不能对此进行逆向工程吗?像打印出 json Log 这样你就知道关键了?
  • @Eenvincible 可以,但是key不一致。所以我想我可能不得不改变它来接受 LinkedTreeMap 或 Object 并自己改变它。
  • 好的,我相信这可以工作

标签: android json retrofit rx-java


【解决方案1】:

你可以使用Response&lt;JsonElement&gt;:

@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");
        }
    });

【讨论】:

    【解决方案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());
                }
            });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-07
      • 2015-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-07
      相关资源
      最近更新 更多