Получение всех объектов внутри объекта JSON Java Android

Поэтому я пытаюсь использовать API League of Legends, который возвращает ответ JSON. Я не использую причудливую библиотеку, такую ​​​​как Jakcson или GSON,

{"type":"champion","version":"5.11.1","data":{"Thresh":{"id":412,"key":"Thresh","name":"Thresh","title":"the Chain Warden"},"Aatrox":{"id":266,"key":"Aatrox","name":"Aatrox","title":"the Darkin Blade"},"Tryndamere":{"id":23,"key":"Tryndamere","name":"Tryndamere","title":"the Barbarian King"},"Gragas":{"id":79,"key":"Gragas","name":"Gragas","title":"the Rabble Rouser"}}}

Но когда я пытаюсь получить доступ к объектам внутри объекта данных, я должен явно указать имя ключа в своем коде.

И имена ключей действительно динамические, поэтому это непрактично.

Есть ли способ получить все объекты внутри объекта данных без явного вызова имен ключей?

Вот мой код на стороне Java-клиента

public String callApi(String API_URL) throws IOException {

    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);

    OkHttpClient client = new OkHttpClient();
    Request request = new Request.Builder()
            .url(API_URL)
            .build();

    Response response = client.newCall(request).execute();
    return response.body().string();
}

public void buttonClick(View view) throws IOException, JSONException {

    String API_URL = "https://global.api.pvp.net/api/lol/static-data/tr/v1.2/champion?locale=en_US&api_key=my_key_here";

    String champions_json = callApi(API_URL);

    Log.i("summoner",champions_json);

    JSONObject json= new JSONObject(champions_json);
    JSONObject data = json.getJSONObject("data");

    Log.i("summoner", String.valueOf(data));

    List<String> champions = new ArrayList<String>();
    champions.add("Garen");
    champions.add("Aatrox");
    champions.add("Thresh");

    for (String champion : champions) {
        JSONObject object = new JSONObject(String.valueOf(data));
        String name = object.getString(champion);
        Log.i("summoner",name);
    }
}

person Community    schedule 24.06.2015    source источник


Ответы (3)


Получите ключи для объекта JSON с помощью keys(), а затем повторите их.

Iterator<String> keys = json.keys();

while (keys.hasNext())
{
    // Get the key
    String key = keys.next();

    // Get the value
    JSONObject value = json.getJSONObject(key);

    // Do something...
}
person Eborbob    schedule 24.06.2015

Вы можете использовать Iterator для анализа данных

  Iterator<?> keys = jObject.keys();

    while( keys.hasNext() ) {
        String key = (String)keys.next();
        if ( jObject.get(key) instanceof JSONObject ) {
    ...
...
..
        }
    }
person strike    schedule 24.06.2015

Вот пример рекурсивного получения всех значений из документа JSON. Здесь используется import org.json.*

    public static void printJSON(JSONObject jsonObj) {
    //Iterating Key Set
    for (Object keyObj : jsonObj.keySet()) {
        String key = (String) keyObj;
        Object valObj = jsonObj.get(key);
        //If next entry is Object
        if (valObj instanceof JSONObject) {
            // call printJSON on nested object
            printJSON((JSONObject) valObj);
        } 
        //iff next entry is nested Array
        else if (valObj instanceof JSONArray) {
            System.out.println("NestedArraykey : " + key);
            printJSONArray((JSONArray) valObj);

        } else {
            System.out.println("key : " + key);
            System.out.println("value : " + valObj.toString());
        }
    }
}

public static void printJSONArray(JSONArray jarray) {
    //Get Object from Array 
    for (int i = 0; i < jarray.length(); i++) {
        printJSON(jarray.getJSONObject(i));
    }

}
person FishingIsLife    schedule 11.12.2018