Модифицированный ответ с динамическими именами массивов JSON

#android #json #kotlin #retrofit

#Android #json #kotlin #модифицированный

Вопрос:

В моем случае у меня есть следующий ответ 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.

Как я могу получить динамически создаваемые массивы и их имена тоже?

Комментарии:

1. Как вы смогли обработать эти динамические имена массивов? Я также использую Retrofit и GSON

Ответ №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) { 

   }
});
  

Комментарии:

1. Спасибо вам за это. Но я получаю объект ResponseBody с «response.body.toString()».. (okhttp3.ResponseBody$ 1@82fdf53). И из-за этого я не могу создать JSONObject :(—ОТРЕДАКТИРУЙТЕ мою ошибку. Я использовал .toString вместо .string . Это решило мою проблему, большое вам спасибо!

2. это не исправлено, тогда как получить неопределенный размер массива? loc1 loc2 может быть 3,4,5, тогда как получить?

3. @RameshKumar если имена ключей не определены, вы можете получить весь набор ключей с помощью object.keys() и получить соответствующий объект.

4. @bhardwaj благодарю yopu за ваш ответ. Можете ли вы отправить какую-либо ссылку, где я могу увидеть полную информацию об этом?

5. @RameshKumar вы можете прочитать developer.android.com/reference/org/json/JSONObject методы