2010-08-04 18 views
128

Estoy construyendo una aplicación 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 .iteración JSON Array en Android/Java

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

recibo una matriz de objetos:

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

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

EDIT: ahora que lo pienso de ella el método que utiliza para repetir el bucle era:

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

Así que supongo que tenía era de alguna manera capaz de girar el JSON devuelto en serie y iterable. ¿Alguna idea de cómo podría lograr esto?

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

+1

cheque fuera del siguiente enlace: https://androidbeasts.wordpress.com/2015/08/04/json-parsing-tutorial/ – Aakash

Respuesta

62

lo he hecho 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 .) make a JSONArray of names

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

en matrices, busque:

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

Creo que este código es corto 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?

+3

¡Agradable y simple! ¡Funciona genial! –

+5

tenga en cuenta que si envía una "matriz" que no tiene números consecutivos, debe usar JSONObject – max4ever

+0

, sí, es perfecto, pero mientras que una gran cantidad de datos es muy lento en el procesamiento :( –

3

Si está utilizando el JSON.org Java implementation, que es de código abierto, que sólo puede hacer JSONArray implementa la interfaz Iterable y añade el siguiente método a la clase:

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

Esto hará que todas las instancias de JSONArray iterables , lo que significa que la sintaxis for (Object foo : bar) ahora funcionará con ella (tenga en cuenta que foo tiene que ser un objeto, 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.

+1

Lo que es interesante es que en un momento la implementación de JSON.org tenía un iterador en la clase JSONArray, pero la eliminaron: https://github.com/douglascrockford/JSON-java/commit/ae8d12c5f4c139d310bf6fee39c35b215d2fec15 – vipw

+0

@vipw Les había enviado un correo electrónico una vez sobre la implementación de Iterable, pero dijeron que finalmente no podrían porque rompería la compatibilidad con Java 1.4. Tal vez fue por eso que se eliminó en la confirmación. – Thunderforge

1

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

Un cheque puede verse como:

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

por desgracia, no es compatible con JSONArray para cada declaración, como:

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

+0

sí, pero devuelve el objeto no JSONObject – Error

+1

La clase JSONArray no implementa la interfaz Iterable – Jorgesys

2

Está utilizando el mismo objeto moldeada para cada entrada. En cada iteración, acaba de cambiar el mismo objeto en lugar de crear uno nuevo.

Este código debe solucionarlo:

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

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