studio recorrer org jsonarray example java android arrays json

recorrer - JSON Array iteration en Android/Java



jsonarray java example (8)

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.


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


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?


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


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


Lo he hecho de dos maneras diferentes,

1.) hacer un mapa

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.) hacer una JSONArray de nombres

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


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


desafortunadamente, JSONArray no admite cada declaración, como:

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