#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 методы