【问题标题】:Retrofit, top level json object changes name改造,顶级 json 对象更改名称
【发布时间】:2016-08-22 06:59:20
【问题描述】:

我正在使用 Retrofit 进行 api 调用。顶级对象的命名取决于请求的查询参数。比如这样的请求:

api.somewebsite.com/1.0/mix_info?mix_id=69

返回如下响应:

{"69":{
    "mix_id":"69",
    "mix_title":"A Title",
    "mix_file":"https:example.com/mp3",
    "mix_genres":"House,Pop",
    "mix_dj_id":"57",
    "number_votes":"390",
    "station":"1" 
    }
}

这里还有一个屏幕截图,有点显示格式: http://prnt.sc/axltcd

基本上,根据传入 url 的数字 mix_id= 查询成为响应中返回的顶级 json 对象的名称。

我能够拼凑出一些可行的东西:

我有一个模型响应类,它有一个成员变量,它是顶级对象,我使用 Retrofit 的 @SerializedName("69") 来明确设置名称。当然,这仅适用于 id 为 69 的请求,否则响应返回 null 对象。

看起来像这样:

public class Response {

     @SerializedName("69")
     private _69 _69;
}

无论如何,我正在寻找一种方法来正确处理这些格式奇怪的响应。这将如何实现?

【问题讨论】:

  • 序列化 HashMap 怎么样?
  • 好吧hashMap.put('yourKey', yourData); serialize(hashMap)
  • 你的建议毫无意义。
  • 这可能没有任何意义,因为我从来没有做过这些,对改造一无所知,但我的意思是,如果你序列化一个 HashMap 而不是一个响应,那么我很确定默认情况下它会被正确序列化。否则,您可能必须配置自定义序列化程序(查看文档)。
  • 尝试使用HashMap<String, Model> 反序列化响应?然后您应该可以使用entrySet() 从该地图中获取值。

标签: android json gson retrofit retrofit2


【解决方案1】:

您可以接收作为 JsonElemen 的响应,将其转换为 JsonObject 并通过您用于发送请求的全局变量获取元素。

回复:

    public void onResponse(Call<JsonElement> call, Response<JsonElement> response) {
         JsonElement jsonElement = response.body();
         JsonObject jObj= jsonElement.getAsJsonObject();
         JsonObject number= jObj.get(CONSTANT_WHICH_YOU_USED_FOR_REQEST).getAsJsonObject();
}

如果有请随时问我。

【讨论】:

    猜你喜欢
    • 2016-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-08
    • 1970-01-01
    • 2013-05-21
    • 2020-08-22
    相关资源
    最近更新 更多