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.

minimalpop
fuente
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");
    // ...
}
notnoop
fuente
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... :)

Piko
fuente
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);
            });
prayagupd
fuente
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 );  
Teja Kantamneni
fuente
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
wired00
fuente
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");

Roger
fuente
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