【问题标题】:Retrofit Response with dynamic JSON array names使用动态 JSON 数组名称改造响应
【发布时间】:2019-03-02 19:52:26
【问题描述】:

在我的情况下,我有以下 json 响应:

{
    "all": {
        "loc1": [
            {
                "userId": "1",
                "userName": "user1"
            },
            {
                "userId": "2",
                "userName": "user2"
            },
            {
                "userId": "2",
                "userName": "user2"
            },
            {
                "userId": "1",
                "userName": "user1"
            },
            {
                "userId": "2",
                "userName": "user2"
            }
        ],
        "loc2": [
            {
                "userId": "1",
                "userName": "user1"
            },
            {
                "userId": "2",
                "userName": "user2"
            },
            {
                "userId": "2",
                "userName": "user2"
            },
            {
                "userId": "1",
                "userName": "user1"
            },
            {
                "userId": "2",
                "userName": "user2"
            }
        ]
    }
}

但是现在,数组 loc1 和 loc2 的名称是动态创建的。如何获得“所有”json 数组的响应以及动态创建的数组的名称。我尝试过这样的事情:

class EventResponse() {
    @SerializedName("all")
    val events: List<List<Event>> = mutableListOf()
}

但我得到一个错误:

应为 BEGIN_ARRAY,但为 BEGIN_OBJECT。

如何获得动态创建的数组及其名称?

【问题讨论】:

  • 您是如何处理这些动态数组名称的?我也在使用 Retrofit 和 GSON

标签: android json kotlin retrofit


【解决方案1】:

在这种情况下,您可以使用 JSONObject 获取动态值,只需将改造响应转换为 JSONObject,因为您必须更改改造调用的响应类型

Call<ResponseBody> call = exampleApi();

call.enqueue(new Callback<ResponseBody>() {

  @Override
  public void onResponse(Response<ResponseBody> response, Retrofit retrofit) {
  String result = response.body().string();
  JSONObject object = new JSONObject(result);

 // can get any value from keys
 // for example in your case
  JSONArray array1 =  object.getJSONObject('all').getJSONArray('loc1');
 //similarly just change key to loc2 and so on

  JSONArray array2 =  object.getJSONObject('all').getJSONArray('loc2');

 }

 @Override
 public void onFailure(Throwable t) { 

   }
});

【讨论】:

  • 谢谢你。但是我得到了带有“response.body.toString()”的 ResponseBody 对象.. (okhttp3.ResponseBody$1@82fdf53)。有了这个,我无法创建 JSONObject :( --- 编辑我的错误。我使用 .toString 而不是 .string。它解决了我的问题,非常感谢!
  • 它不固定那么如何获得未定义的数组大小? loc1 loc2 可能是 3,4,5 那么怎么得到呢?
  • @RameshKumar 如果未定义键名,您可以使用 object.keys() 获取所有键集并获取相应的对象。
  • @bhardwaj 感谢 yopu 的回复。你能发送任何链接,我可以看到它的完整信息吗?
  • @RameshKumar 你可以阅读developer.android.com/reference/org/json/JSONObject方法
猜你喜欢
  • 2020-06-07
  • 1970-01-01
  • 2021-05-28
  • 1970-01-01
  • 1970-01-01
  • 2019-07-13
  • 1970-01-01
  • 2021-09-06
  • 2019-03-14
相关资源
最近更新 更多