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.

Kevin Bradshaw
quelle
1
Schauen
Aakash

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));
        }
    }
Nathan Schwermann
quelle
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?

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

Traum
quelle
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...
}
Graham S.
quelle
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.

Donnerschmiede
quelle
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"); 
Paul Burke
quelle
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;
Andriya
quelle
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);
18446744073709551615
quelle