Acceso a miembros de elementos en un JSONArray con Java


122

Estoy empezando a usar json con java. No estoy seguro de cómo acceder a los valores de cadena dentro de un JSONArray. Por ejemplo, mi json se ve así:

{
  "locations": {
    "record": [
      {
        "id": 8817,
        "loc": "NEW YORK CITY"
      },
      {
        "id": 2873,
        "loc": "UNITED STATES"
      },
      {
        "id": 1501
        "loc": "NEW YORK STATE"
      }
    ]
  }
}

mi código:

JSONObject req = new JSONObject(join(loadStrings(data.json),""));
JSONObject locs = req.getJSONObject("locations");
JSONArray recs = locs.getJSONArray("record");

Tengo acceso al "registro" JSONArray en este punto, pero no estoy seguro de cómo obtener los valores "id" y "loc" dentro de un bucle for. Lo siento si esta descripción no es muy clara, soy un poco nuevo en programación.


2
Otra cosa (probablemente lo encontraste): te has perdido una coma después del tercer valor de identificación. Es bueno usar siempre algún analizador, por ejemplo json.parser.online.fr
Krystian

Respuestas:


218

¿Has intentado usar JSONArray.getJSONObject (int) y JSONArray.length () para crear tu bucle for:

for (int i = 0; i < recs.length(); ++i) {
    JSONObject rec = recs.getJSONObject(i);
    int id = rec.getInt("id");
    String loc = rec.getString("loc");
    // ...
}

No entiendo esto. Si podemos obtener iduna sinple getIntcomo cómo obtenemos el valor de un hashmap especificando la clave, entonces ¿por qué tenemos que iterar con un bucle for? ¿La iteración con el ciclo no hace que idse asigne int idvarias veces?
Nav

Para JSON más complejo encontró esta buena solución por ejemplos
Javacodegeeks.com/core-java/json/…

¿Cómo puedo hacer esto para PHP?
Hanie Asemi

¿Cómo funcionaría esto si conozco la ID pero necesito la ubicación correspondiente?
ToofanHasArrived

6

Un org.json.JSONArray no es iterable.
Así es como proceso elementos en un net.sf.json.JSONArray :

    JSONArray lineItems = jsonObject.getJSONArray("lineItems");
    for (Object o : lineItems) {
        JSONObject jsonLineItem = (JSONObject) o;
        String key = jsonLineItem.getString("key");
        String value = jsonLineItem.getString("value");
        ...
    }

Funciona genial... :)


10
Esto no funciona para mí, ya que a JSONArrayno es iterable.
michel404

8
org.json.JSONArray no es iterable, pero net.sf.json.JSONArray es Iterable
majgis

su enlace está roto
VdeX

4

Java 8 está en el mercado después de casi 2 décadas, la siguiente es la forma de iterar org.json.JSONArraycon java8 Stream API.

import org.json.JSONArray;
import org.json.JSONObject;

@Test
public void access_org_JsonArray() {
    //Given: array
    JSONArray jsonArray = new JSONArray(Arrays.asList(new JSONObject(
                    new HashMap() {{
                        put("a", 100);
                        put("b", 200);
                    }}
            ),
            new JSONObject(
                    new HashMap() {{
                        put("a", 300);
                        put("b", 400);
                    }}
            )));

    //Then: convert to List<JSONObject>
    List<JSONObject> jsonItems = IntStream.range(0, jsonArray.length())
            .mapToObj(index -> (JSONObject) jsonArray.get(index))
            .collect(Collectors.toList());

    // you can access the array elements now
    jsonItems.forEach(arrayElement -> System.out.println(arrayElement.get("a")));
    // prints 100, 300
}

Si la iteración es solo una vez, (no es necesario .collect)

    IntStream.range(0, jsonArray.length())
            .mapToObj(index -> (JSONObject) jsonArray.get(index))
            .forEach(item -> {
               System.out.println(item);
            });

1
.mapToObjmuestra "excepción no controlada: JSONException"
Andrejs

1
en la sintaxis .mapToObj(index -> (JSONObject) array.get(index)), los theres jsonArray.get(index)que potencialmente pueden lanzar JSONException, pero JSONException extends RuntimeExceptionlo que debe multar al menos en tiempo de compilación
prayagupd

2

Al mirar su código, siento que está utilizando JSONLIB. Si ese fuera el caso, mire el siguiente fragmento para convertir json array a java array ..

 JSONArray jsonArray = (JSONArray) JSONSerializer.toJSON( input );  
 JsonConfig jsonConfig = new JsonConfig();  
 jsonConfig.setArrayMode( JsonConfig.MODE_OBJECT_ARRAY );  
 jsonConfig.setRootClass( Integer.TYPE );  
 int[] output = (int[]) JSONSerializer.toJava( jsonArray, jsonConfig );  

0

En caso de que ayude a alguien más, pude convertir a una matriz haciendo algo como esto,

JSONObject jsonObject = (JSONObject)new JSONParser().parse(jsonString);
((JSONArray) jsonObject).toArray()

... o deberías poder obtener la longitud

((JSONArray) myJsonArray).toArray().length

org.json.JSONObjecttiene un toJSONArray(JSONArray names)método y org.json.JSONArraytiene un toJSONObject(JSONArray names)método pero no tiene un toArray()método.
BrionS

-1

HashMap regs = (HashMap) parser.parse (stringjson);

(Cadena) (( HashMap ) regs.get ("firstlevelkey")). Get ("secondlevelkey");


1
Un poco más de aclaración de por qué su respuesta es mejor que la actual aceptada ayudaría a comprender su solución.
Vadimo
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.