it-swarm.com.de

JSON-Array-Iteration in Android / Java

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 jemand sagen, wie ich ein JSON-Array am besten durchlaufen 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?

BEARBEITEN: Jetzt, da ich daran denke, war die Methode, die ich zum Durchlaufen der Schleife verwendet habe:

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

Also war ich wohl irgendwie in der Lage, den zurückgegebenen Json in ein iterables Array umzuwandeln. Irgendwelche Ideen, wie ich das erreichen könnte?

Ich entschuldige mich für meine Unbestimmtheit, aber ich hatte diese Arbeit von einem Beispiel, das ich im Web gefunden habe und seitdem nicht finden konnte.

145
Kevin Bradshaw

Ich habe es auf zwei verschiedene Arten gemacht,

1.) mache eine 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.) mache ein JSONArray von 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));
        }
    }
67
schwiz

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

Ist es das wonach du gesucht hast?

328
vipw

Leider unterstützt JSONArraynichtforeach Anweisungen, wie:

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

Wenn Sie die Open Source-Implementierung JSON.org Java verwenden, können Sie JSONArray einfach veranlassen, die Schnittstelle Iterable zu implementieren und die hinzuzufügen folgende Methode an die Klasse:

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

Dies macht 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.

3
Thunderforge

Suchen Sie in Arrays nach:

JSONArray menuitemArray = popupObject.getJSONArray("menuitem"); 
3
Paul Burke

Als ich den Vorschlag von @ vipw ausprobierte, war ich mit folgender 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...
}
3
Graham S.

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

Dieser Code sollte es 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;
2
Andriya

Achten Sie beim Durchlaufen eines JSON-Arrays (org.json.JSONArray, integriert in Android) auf null Objekte. Zum Beispiel können Sie "null" anstelle eines null Strings.

Ein Scheck könnte so aussehen:

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