Reputation: 6427
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.
Upvotes: 156
Views: 227491
Reputation: 869
Alternatively, especially on Android where there is no iterator()
, you could define your own iterator :
import java.util.Iterator;
import org.json.JSONArray;
import org.json.JSONException;
public final
class JSONArrayIterator<E> implements Iterator<E> {
private JSONArray jsonArray;
private int l;
private int i;
JSONArrayIterator(JSONArray jsonArray) {
this.jsonArray = jsonArray;
this.l = jsonArray.length();
this.i = 0;
}
@SuppressWarnings("unchecked")
public E next() {
try {
Object o = this.jsonArray.get(this.i++);
return (E)o;
} catch (JSONException ex) {
}
return null;
}
}
It works when you assume the element types of your array are all the same. This might not be considered a good practice in many cases, so you might want to add more type-checking.
But then you can then use :
for (JSONObject row: new JSONArrayIterator<JSONObject>(jsonArray)){
id = row.getInt("id");
name = row.getString("name");
password = row.getString("password");
}
Upvotes: 0
Reputation: 103
Unfortunately , JSONArray
doesn't support foreach
statements, like:
for(JSONObject someObj : someJsonArray) {
// do something about someObj
....
....
}
Upvotes: 7
Reputation: 25584
On Arrays, look for:
JSONArray menuitemArray = popupObject.getJSONArray("menuitem");
Upvotes: 3
Reputation: 31503
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));
}
}
Upvotes: 69
Reputation: 1550
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...
}
Upvotes: 5
Reputation: 241
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;
Upvotes: 2
Reputation: 7645
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?
Upvotes: 347
Reputation: 20605
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.
Upvotes: 3
Reputation: 16882
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);
Upvotes: 1