JSON-Array-Iteration in Android / Java


148

Ich erstelle eine Android-App, die heruntergeladen und mit einer Online-Datenbank synchronisiert werden muss. Ich sende meine Anfrage von der App an eine PHP-Seite, die die relevanten Zeilen aus einer Datenbank im JSON-Format zurückgibt.

Kann mir bitte jemand sagen, wie ich am besten durch ein JSON-Array iterieren kann?

Ich erhalte eine Reihe von Objekten:

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

Was ist der einfachste Code, mit dem ich auf die JSONObjects im Array zugreifen kann?

EDIT: Jetzt, wo ich darüber nachdenke, war die Methode, mit der ich die Schleife iteriert habe:

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

Ich glaube, ich war irgendwie in der Lage, den zurückgegebenen Json in ein iterierbares Array zu verwandeln. Irgendwelche Ideen, wie ich das erreichen könnte?

Ich entschuldige mich für meine Unbestimmtheit, aber ich hatte dies anhand eines Beispiels, das ich im Internet gefunden habe und seitdem nicht mehr finden konnte.


Antworten:


67

Ich habe es auf zwei verschiedene Arten gemacht,

1.) mache eine Karte

        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.) Erstellen Sie ein JSONArray mit Namen

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

335

Ich denke, dieser Code ist kurz und klar:

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

Haben Sie danach gesucht?


3
Schön und einfach! Funktioniert super!
Kervin Ramen

5
Beachten Sie, dass Sie JSONObject
max4ever

Ja, es ist perfekt, aber während große Datenmengen sehr langsam verarbeitet werden :(
Ahmad Arslan

@ArslanAhmad Wenn Sie über eine große Datenmenge verfügen, möchten Sie nicht das gesamte JSON-Objektarray im Speicher erstellen. Verwenden Sie stattdessen einen SAX-ähnlichen Ansatz. Siehe hier: stackoverflow.com/questions/10657725/…
vipw

Das funktioniert bei mir nicht. Ich erhalte eine JSON-Ausnahme wegen der Klammer "{", die das Objekt umgibt.
filthy_wizard

7

Unterstützt leider JSONArray keineforeach Aussagen wie:

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


es tut, aber es gibt Objekt nicht JSONObject zurück
Fehler

3
JSONArray-Klasse implementiert keine Iterable-Schnittstelle
Jorgesys

4

Als ich den Vorschlag von @ vipw ausprobierte, war ich mit dieser Ausnahme konfrontiert: The method getJSONObject(int) is undefined for the type JSONArray

Das hat bei mir stattdessen funktioniert:

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

Für Android habe ich stattdessen myJsonArray.size () in myJsonArray.length () geändert
Rishiraj Purohit

3

Wenn Sie die Open Source- Java-Implementierung JSON.org verwenden, können Sie JSONArray einfach die Schnittstelle implementieren Iterablelassen und der Klasse die folgende Methode hinzufügen:

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

Dadurch werden alle Instanzen von JSONArray iterierbar, was bedeutet, dass die for (Object foo : bar)Syntax jetzt damit funktioniert (beachten Sie, dass foo ein Objekt sein muss, da JSONArrays keinen deklarierten Typ haben). All dies funktioniert, weil die JSONArray-Klasse von einer einfachen ArrayList unterstützt wird, die bereits iterierbar ist. Ich stelle mir vor, dass andere Open Source-Implementierungen genauso einfach zu ändern wären.


1
Interessant ist, dass die JSON.org-Implementierung einmal einen Iterator in der JSONArray-Klasse hatte, diesen jedoch entfernt hat: github.com/douglascrockford/JSON-java/commit/…
vipw

@vipw Ich hatte ihnen einmal eine E-Mail über die Implementierung von Iterable geschickt, aber sie sagten, dass dies letztendlich nicht möglich sei, da dies die Kompatibilität mit Java 1.4 beeinträchtigen würde. Vielleicht wurde es deshalb im Commit entfernt.
Thunderforge

3

Suchen Sie auf Arrays nach:

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

2

Sie verwenden für jeden Eintrag dasselbe Cast-Objekt. Bei jeder Iteration haben Sie nur dasselbe Objekt geändert, anstatt ein neues zu erstellen.

Dieser Code sollte das Problem beheben:

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;

1

Achten Sie beim Iterieren über ein JSON-Array (org.json.JSONArray, integriert in Android) auf Nullobjekte . Beispielsweise erhalten Sie möglicherweise "null"anstelle einer Nullzeichenfolge .

Ein Scheck kann folgendermaßen aussehen:

s[i] = array.isNull(i) ? null : array.getString(i);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.