Getting all objects within an object JSON Java Android

4.7k views Asked by At

So im trying to consume the League of Legends API which returns a JSON response. Im not using a fancy lib like Jakcson or 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"}}}

But when I try to get to the objects within the data object I must explicity list the key name in my code.

And the key names are really dynamic, so its not practical.

Is there any way to get all the objects within the data object without explicitly calling out the key names?

Heres my Java Client side code

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);
    }
}
3

There are 3 answers

0
Eborbob On BEST ANSWER

Get the keys for the JSON Object with keys() and then iterate over them.

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...
}
0
strike On

You can use Iterator for parsing the data

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

    while( keys.hasNext() ) {
        String key = (String)keys.next();
        if ( jObject.get(key) instanceof JSONObject ) {
    ...
...
..
        }
    }
0
FishingIsLife On

Here's an example to get all Values from JSON Document recursivly. Here import org.json.* is used

    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));
    }

}