JSON Array iteration in Android/Java

2018-12-31 15:01发布

问题:

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.

回答1:

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


回答2:

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?



回答3:

unfortunately , JSONArray doesn\'t support for each statement, like:

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



回答4:

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.



回答5:

On Arrays, look for:

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


回答6:

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;


回答7:

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...
}


回答8:

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