2010-08-04 6 views
128

Ich baue eine Android App, die mit einer Online-Datenbank herunterladen und synchronisieren muss, ich sende meine Abfrage von der App auf eine PHP-Seite, die die relevanten Zeilen aus einer Datenbank im JSON-Format zurückgibt .JSON Array-Iteration in Android/Java

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

Ich erhalte ein Array von Objekten:

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

Was das einfachste Stück Code ist konnte ich die JSONObjects im Array zugreifen zu?

EDIT: jetzt, wo ich darüber denke, die Methode, die ich verwendet, um die Schleife zu durchlaufen war:

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

Also ich denke, ich hatte, war irgendwie in der Lage die zurück Json in und iterable Array zu drehen. Irgendwelche Ideen, wie ich das erreichen könnte?

Ich entschuldige mich für meine Vagunität, aber ich hatte dies funktioniert von einem Beispiel, das ich im Internet gefunden und seitdem nicht finden konnte.

+1

Scheck aus folgendem Link: https://androidbeasts.wordpress.com/2015/08/04/json-parsing-tutorial/ – Aakash

Antwort

62

ich es zwei verschiedene Arten geschehen,

1.) eine Karte machen

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

Auf Arrays, sucht:

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

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 das, was Sie suchen?

+3

Schön und einfach! Funktioniert super! –

+5

Beachten Sie, dass wenn Sie ein "Array" senden, das keine fortlaufenden Nummern hat, müssen Sie JSONObject – max4ever

+0

ja es perfekt verwenden, aber während große Datenmenge ist sehr langsam in der Verarbeitung :( –

3

Wenn Sie die JSON.org Java implementation verwenden, die Open-Source ist, können Sie einfach JSONArray die Iterable Schnittstelle machen implementieren und die folgende Methode zur Klasse hinzufügen:

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

Dies wird alle Instanzen JSONArray machen iterable , was bedeutet, dass die for (Object foo : bar) Syntax jetzt damit arbeiten wird (beachte, dass foo ein Objekt sein muss, weil 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 zu einer Zeit die JSON.org Implementierung einen Iterator hatte die JSONArray-Klasse, aber sie haben es entfernt: https://github.com/douglascrockford/JSON-java/commit/ae8d12c5f4c139d310bf6fee39c35b215d2fec15 – vipw

+0

@ vipw Ich hatte ihnen per E-Mail einmal über die Implementierung von Iterable, aber sie sagten das konnten sie letztendlich nicht, weil es die Kompatibilität mit Java 1.4 brechen würde. Vielleicht wurde das deshalb im Commit entfernt. – Thunderforge

1

Beim Iterieren über ein JSON-Array (org.json.JSONArray, in Android integriert), achten Sie auf null Objekte; Sie können beispielsweise "null" statt null Zeichenfolge erhalten.

kann eine Prüfung wie folgt aussehen:

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

leider nicht JSONArray nicht für jede Aussage unterstützen, wie:

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

+0

tut es, aber es return object nicht JSONObject – Error

+1

JSONArray-Klasse implementiert keine Iterable-Schnittstelle – Jorgesys

2

Sie die gleiche Besetzung mit Objekt für jeden Eintrag. Bei jeder Iteration haben Sie nur dasselbe Objekt geändert und stattdessen ein neues Objekt erstellt.

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

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

Dieses statt für mich gearbeitet:

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