Android: динамическое получение имени ключа массива JSON из JSON

У меня есть ссылка json, если мы ее откроем, я получу следующий результат

{
"Status": "Success",

"All_Details": [{
    "Types": "0",
    "TotalPoints": "0",
    "ExpiringToday": 0
}],
"First": [{
    "id": "0",
    "ImagePath": "http://first.example.png"
}],
"Second": [{
    "id": "2",
    "ImagePath": "http://second.example.png"
}],
"Third": [{
    "id": "3",
    "ImagePath": "http://third.example.png"
}],

}

Что мне нужно, так это то, что я хочу динамически получать все имена ключей, такие как статус, All_details, First и т. д.

И я также хочу получить данные внутри массива All_details и First. Я использовал следующий метод

@Override
        public void onResponse(JSONObject response) throws JSONException {
            VolleyLog.d(TAG, "Home Central OnResponse: " + response);

            String statusStr = response.getString("Status");
            Log.d(TAG, "Status: " + statusStr);

            if (statusStr.equalsIgnoreCase("Success")) {
                Iterator iterator = response.keys();
                while (iterator.hasNext()) {
                    String key = (String)iterator.next();
                }
            }
        }

Я получаю все имена ключей, хранящиеся в ключе String. Но я не могу открыть значения внутри массива JSON, например. Мне нужно получить значения внутри первого и второго массива, используя строку (ключ). Как мне это сделать.???


person Encipherer    schedule 08.03.2016    source источник


Ответы (5)


Во-первых, чтобы получить имена ключей, вы можете легко выполнить итерацию по самому объекту JSON, как указано здесь:

Iterator<?> keys = response.keys();
while( keys.hasNext() ) {
    String key = (String)keys.next();
    if ( response.get(key) instanceof JSONObject ) {
        System.out.println(key); // do whatever you want with it
    }
}

Затем, чтобы получить значения массива:

    JSONArray arr = response.getJSONArray(key);
    JSONObject element;
    for(int i = 0; i < arr.length(); i++){
        element = arr.getJSONObject(i); // which for example will be Types,TotalPoints,ExpiringToday in the case of the first array(All_Details) 
    }
person Muhammed Refaat    schedule 08.03.2016
comment
@IndependentDev Пожалуйста, и рад, что смог вам помочь :) - person Muhammed Refaat; 08.03.2016


Что-то вроде этого позволит вам перебирать массив и отдельные поля после того, как вы извлекли ключи, используя то, что вы сделали. Вместо «Типы» используйте ключевую переменную, которую вы создадите перед этим.

JSONArray allDetails = response.getJsonArray("All_Details")

for (int i = 0 ; i < allDetails.length(); i++) {
    JSONObject allDetail = allDetails.getJSONObject(i);
    allDetails.getString("Types");
}
person Bhushan Bhangale    schedule 08.03.2016
comment
Мне не нужен этот метод. Я хочу динамически получать имена массивов (например, All_details), и, используя это, я хочу динамически получать значения внутри этого массива. - person Encipherer; 08.03.2016

Прежде всего, я хочу сообщить вам, что это недействительный JSON. Удалите последнюю запятую (,), чтобы сделать ее действительной.

Затем вы можете выполнить итерацию, как здесь

JSONArray myKeys = response.names();
person Shree Krishna    schedule 08.03.2016

Попробуй это

Iterator keys = jsonObject.keys();
    while (keys.hasNext()) {
        try {
            String dynamicKey = (String) keys.next();//Your dynamic key
            JSONObject item = jsonObject.getJSONObject(dynamicKey);//Your json object for that dynamic key
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
person Devishankar    schedule 08.03.2016