问题
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);
}
}
回答1:
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...
}
回答2:
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 ) {
...
...
..
}
}
回答3:
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));
}
}
来源:https://stackoverflow.com/questions/31025665/getting-all-objects-within-an-object-json-java-android