JSON Array iteration in Android/Java

JavaAndroidArraysJson

Java Problem Overview


I am building an android app that needs to download and synchronise with an online database, I am sending my query from the app to a php page which returns the relevant rows from a database in JSON format.

can someone please tell me the best way to iterate through a JSON array?

I receive an array of objects:

[{json object},{json object},{json object}]

What is the simplest piece of code I could use to access the JSONObjects in the array?

EDIT: now that I think of it the method I used to iterate the loop was:

for (String row: json){
     id = row.getInt("id");
     name = row.getString("name");
     password = row.getString("password");
}

So I guess I had was somehow able to turn the returned Json into and iterable array. Any Ideas how I could achieve this?

I apologise for my vaguness but I had this working from an example I found on the web and have since been unable to find it.

Java Solutions


Solution 1 - Java

I think this code is short and clear:

int id;
String name;
JSONArray array = new JSONArray(string_of_json_array);
for (int i = 0; i < array.length(); i++) {
    JSONObject row = array.getJSONObject(i);
    id = row.getInt("id");
    name = row.getString("name");
}

Is that what you were looking for?

Solution 2 - Java

I have done it two different ways,

1.) make a Map

        HashMap<String, String> applicationSettings = new HashMap<String,String>();
    	for(int i=0; i<settings.length(); i++){
			String value = settings.getJSONObject(i).getString("value");
			String name = settings.getJSONObject(i).getString("name");
			applicationSettings.put(name, value);
		}

2.) make a JSONArray of names

    JSONArray names = json.names();
	JSONArray values = json.toJSONArray(names);
	for(int i=0; i<values.length(); i++){
		if (names.getString(i).equals("description")){
			setDescription(values.getString(i));
		}
		else if (names.getString(i).equals("expiryDate")){
			String dateString = values.getString(i);
			setExpiryDate(stringToDateHelper(dateString)); 
		}
		else if (names.getString(i).equals("id")){
			setId(values.getLong(i));
		}
		else if (names.getString(i).equals("offerCode")){
			setOfferCode(values.getString(i));
		}
		else if (names.getString(i).equals("startDate")){
			String dateString = values.getString(i);
			setStartDate(stringToDateHelper(dateString));
		}
		else if (names.getString(i).equals("title")){
			setTitle(values.getString(i));
		}
	}

Solution 3 - Java

Unfortunately , JSONArray doesn't support foreach statements, like:

for(JSONObject someObj : someJsonArray) {
    // do something about someObj
    ....
    ....
}

Solution 4 - Java

When I tried @vipw's suggestion, I was faced with this exception:

The method getJSONObject(int) is undefined for the type JSONArray

This worked for me instead:

int myJsonArraySize = myJsonArray.size();

for (int i = 0; i < myJsonArraySize; i++) {
    JSONObject myJsonObject = (JSONObject) myJsonArray.get(i);
	
    // Do whatever you have to do to myJsonObject...
}

Solution 5 - Java

On Arrays, look for:

> JSONArray menuitemArray = popupObject.getJSONArray("menuitem");

Solution 6 - Java

If you're using the JSON.org Java implementation, which is open source, you can just make JSONArray implement the Iterable interface and add the following method to the class:

@Override
public Iterator iterator() {
	return this.myArrayList.iterator();
}

This will make all instances of JSONArray iterable, meaning that the for (Object foo : bar) syntax will now work with it (note that foo has to be an Object, because JSONArrays do not have a declared type). All this works because the JSONArray class is backed by a simple ArrayList, which is already iterable. I imagine that other open source implementations would be just as easy to change.

Solution 7 - Java

You are using the same Cast object for every entry. On each iteration you just changed the same object instead creating a new one.

This code should fix it:

JSONArray jCastArr = jObj.getJSONArray("abridged_cast");
ArrayList<Cast> castList= new ArrayList<Cast>();

for (int i=0; i < jCastArr.length(); i++) {
    Cast person = new Cast();  // create a new object here
    JSONObject jpersonObj = jCastArr.getJSONObject(i);

    person.castId = (String) jpersonObj.getString("id");
    person.castFullName = (String) jpersonObj.getString("name");

    castList.add(person);
}
details.castList = castList;

Solution 8 - Java

While iterating over a JSON array (org.json.JSONArray, built into Android), watch out for null objects; for example, you may get "null" instead of a null string.

A check may look like:

s[i] = array.isNull(i) ? null : array.getString(i);

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionKevin BradshawView Question on Stackoverflow
Solution 1 - JavavipwView Answer on Stackoverflow
Solution 2 - JavaNathan SchwermannView Answer on Stackoverflow
Solution 3 - JavaDreamView Answer on Stackoverflow
Solution 4 - JavaGraham S.View Answer on Stackoverflow
Solution 5 - JavaPaul BurkeView Answer on Stackoverflow
Solution 6 - JavaThunderforgeView Answer on Stackoverflow
Solution 7 - JavaAndriyaView Answer on Stackoverflow
Solution 8 - Java18446744073709551615View Answer on Stackoverflow