JSON Array iteration en Android / Java

Estoy construyendo una aplicación de Android que necesita descargar y sincronizar con una base de datos en línea, estoy enviando mi consulta desde la aplicación a una página php que devuelve las filas relevantes de una base de datos en formato JSON.

¿Puede alguien decirme la mejor manera de iterar a través de una matriz JSON?

Recibo una variedad de objetos:

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

¿Cuál es la pieza de código más simple que podría usar para acceder a JSONObjects en la matriz?

EDITAR: ahora que lo pienso, el método que utilicé para iterar el ciclo fue:

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

Así que supongo que de alguna manera pude convertir el Json devuelto en una matriz iterable. ¿Alguna idea de cómo podría lograr esto?

Me disculpo por mi vaguness, pero hice que funcionara con un ejemplo que encontré en la web y desde entonces no he podido encontrarlo.

Lo he hecho de dos maneras diferentes,

1.) hacer un mapa

  HashMap applicationSettings = new HashMap(); for(int i=0; i 

2.) hacer una JSONArray de nombres

  JSONArray names = json.names(); JSONArray values = json.toJSONArray(names); for(int i=0; i 

Creo que este código es breve y claro:

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

¿Es eso lo que estabas buscando?

desafortunadamente, JSONArray no admite cada statement, como:

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

Si está utilizando la implementación Java de JSON.org , que es de código abierto, puede hacer que JSONArray implemente la interfaz Iterable y agregar el siguiente método a la clase:

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

Esto hará que todas las instancias de JSONArray sean repetibles, lo que significa que la syntax for (Object foo : bar) ahora funcionará con ella (tenga en cuenta que foo tiene que ser un Object, porque JSONArrays no tiene un tipo declarado). Todo esto funciona porque la clase JSONArray está respaldada por una ArrayList simple, que ya es iterable. Imagino que otras implementaciones de código abierto serían igual de fáciles de cambiar.

En Arrays, busca:

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

Está utilizando el mismo objeto Cast para cada entrada. En cada iteración, usted cambió el mismo objeto en lugar de crear uno nuevo.

Este código debería arreglarlo:

 JSONArray jCastArr = jObj.getJSONArray("abridged_cast"); ArrayList castList= new ArrayList(); 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; 

Cuando probé la sugerencia de @ vipw, me encontré con esta excepción: The method getJSONObject(int) is undefined for the type JSONArray

Esto funcionó para mí en su lugar:

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

Al iterar sobre una matriz JSON (org.json.JSONArray, integrada en Android), tenga cuidado con los objetos nulos ; por ejemplo, puede obtener "null" lugar de una cadena nula .

Un cheque puede verse así:

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