Acceder a miembros de elementos en un JSONArray con Java

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 obtendría los valores “id” y “loc” dentro de un ciclo for. Lo siento si esta descripción no está muy clara, soy un poco nuevo en la progtwigción.

¿Ha intentado usar [ JSONArray.getJSONObject(int) ] ( http://json.org/javadoc/org/json/JSONArray.html#getJSONObject(int)) , y [ JSONArray.length() ] ( http: // json.org/javadoc/org/json/JSONArray.html#length ()) para crear su 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"); // ... } 

Un org.json.JSONArray no es iterable.
Así es como proceso los elementos en 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… 🙂

Java 8 está en el mercado después de casi 2 décadas, a continuación se presenta la forma de iterar org.json.JSONArray con 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 List 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); }); 

Al mirar su código, siento que está usando JSONLIB. Si ese fue el caso, mira el siguiente fragmento para convertir una matriz json a una matriz Java.

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

En caso de que ayude a otra persona, pude convertir a una matriz haciendo algo como esto,

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

… o debería ser capaz de obtener la longitud

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

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

(String) (( HashMap ) regs.get (“firstlevelkey”)). Get (“secondlevelkey”);