¿Cómo iterar sobre un JSONObject?

Utilizo una biblioteca JSON llamada JSONObject (no me importa cambiar si es necesario).

Sé cómo iterar sobre JSONArrays , pero cuando JSONArrays datos JSON de Facebook no obtengo una matriz, solo un JSONObject , pero necesito poder acceder a un elemento a través de su índice, como JSONObject[0] para obtener el primero, y no puedo entender cómo hacerlo.

 { "http://http://url.com/": { "id": "http://http://url.com//" }, "http://url2.co/": { "id": "http://url2.com//", "shares": 16 } , "http://url3.com/": { "id": "http://url3.com//", "shares": 16 } } 

Tal vez esto ayude:

 jObject = new JSONObject(contents.trim()); Iterator< ?> keys = jObject.keys(); while( keys.hasNext() ) { String key = (String)keys.next(); if ( jObject.get(key) instanceof JSONObject ) { } } 

para mi caso, encontré que iterar los names() funciona bien

 for(int i = 0; i
		      	

Evitaré el iterador ya que pueden agregar / eliminar objetos durante la iteración y también para el código limpio usar un ciclo for. menos código de línea simple.

 import org.json.simple.JSONObject; public static void printJsonObject(JSONObject jsonObj) { for (Object key : jsonObj.keySet()) { //based on you key types String keyStr = (String)key; Object keyvalue = jsonObj.get(keyStr); //Print key and value System.out.println("key: "+ keyStr + " value: " + keyvalue); //for nested objects iteration if required if (keyvalue instanceof JSONObject) printJsonObject((JSONObject)keyvalue); } } 
 Iterator iterator = jsonObject.values().iterator(); while (iterator.hasNext()) { jsonChildObject = iterator.next(); // Do whatever you want with jsonChildObject String id = (String) jsonChildObject.get("id"); } 

No crea que no existe una solución más simple y segura que usar un iterador …

El método JSONObject names () devuelve un JSONArray de las claves JSONObject, por lo que puedes simplemente recorrerlo en bucle:

 JSONObject object = new JSONObject (); JSONArray keys = object.names (); for (int i = 0; i < keys.length (); ++i) { String key = keys.getString (i); // Here's your key String value = object.getString (key); // Here's your value } 

Primero pon esto en alguna parte:

 private  Iterable iteratorToIterable(final Iterator iterator) { return new Iterable() { @Override public Iterator iterator() { return iterator; } }; } 

O si tiene acceso a Java8, solo esto:

 private  Iterable iteratorToIterable(Iterator iterator) { return () -> iterator; } 

Luego simplemente itere sobre las claves y valores del objeto:

 for (String key : iteratorToIterable(object.keys())) { JSONObject entry = object.getJSONObject(key); // ... 

org.json.JSONObject ahora tiene un método keySet () que devuelve un Set y se puede enlazar fácilmente con un for-each.

 for(String key : jsonObject.keySet()) 

Hice una pequeña función recursiva que atraviesa todo el objeto json y guarda la ruta de la clave y su valor.

 // My stored keys and values from the json object HashMap myKeyValues = new HashMap(); // Used for constructing the path to the key in the json object Stack key_path = new Stack(); // Recursive function that goes through a json object and stores // its key and values in the hashmap private void loadJson(JSONObject json){ Iterator< ?> json_keys = json.keys(); while( json_keys.hasNext() ){ String json_key = (String)json_keys.next(); try{ key_path.push(json_key); loadJson(json.getJSONObject(json_key)); }catch (JSONException e){ // Build the path to the key String key = ""; for(String sub_key: key_path){ key += sub_key+"."; } key = key.substring(0,key.length()-1); System.out.println(key+": "+json.getString(json_key)); key_path.pop(); myKeyValues.put(key, json.getString(json_key)); } } if(key_path.size() > 0){ key_path.pop(); } } 

Con Java 8 y lambda, limpiador:

 JSONObject jObject = new JSONObject(contents.trim()); jObject.keys().forEachRemaining(k -> { }); 

https://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html#forEachRemaining-java.util.function.Consumer-

Una vez tuve un json que tenía identificadores que necesitaban incrementarse en uno ya que estaban indexados en 0 y eso estaba rompiendo el autoincremento de Mysql.

Entonces, para cada objeto escribí este código, podría ser útil para alguien:

 public static void incrementValue(JSONObject obj, List keysToIncrementValue) { Set keys = obj.keySet(); for (String key : keys) { Object ob = obj.get(key); if (keysToIncrementValue.contains(key)) { obj.put(key, (Integer)obj.get(key) + 1); } if (ob instanceof JSONObject) { incrementValue((JSONObject) ob, keysToIncrementValue); } else if (ob instanceof JSONArray) { JSONArray arr = (JSONArray) ob; for (int i=0; i < arr.length(); i++) { Object arrObj = arr.get(0); if (arrObj instanceof JSONObject) { incrementValue((JSONObject) arrObj, keysToIncrementValue); } } } } } 

uso:

 JSONObject object = .... incrementValue(object, Arrays.asList("id", "product_id", "category_id", "customer_id")); 

esto puede transformarse para que funcione con JSONArray como objeto principal también

El siguiente código funcionó bien para mí. Por favor, ayúdenme si se puede hacer el ajuste. Esto obtiene todas las claves incluso de los objetos JSON nesteds.

 public static void main(String args[]) { String s = ""; // Sample JSON to be parsed JSONParser parser = new JSONParser(); JSONObject obj = null; try { obj = (JSONObject) parser.parse(s); @SuppressWarnings("unchecked") List parameterKeys = new ArrayList(obj.keySet()); List result = null; List keys = new ArrayList<>(); for (String str : parameterKeys) { keys.add(str); result = this.addNestedKeys(obj, keys, str); } System.out.println(result.toString()); } catch (ParseException e) { e.printStackTrace(); } } public static List addNestedKeys(JSONObject obj, List keys, String key) { if (isNestedJsonAnArray(obj.get(key))) { JSONArray array = (JSONArray) obj.get(key); for (int i = 0; i < array.length(); i++) { try { JSONObject arrayObj = (JSONObject) array.get(i); List list = new ArrayList<>(arrayObj.keySet()); for (String s : list) { putNestedKeysToList(keys, key, s); addNestedKeys(arrayObj, keys, s); } } catch (JSONException e) { LOG.error("", e); } } } else if (isNestedJsonAnObject(obj.get(key))) { JSONObject arrayObj = (JSONObject) obj.get(key); List nestedKeys = new ArrayList<>(arrayObj.keySet()); for (String s : nestedKeys) { putNestedKeysToList(keys, key, s); addNestedKeys(arrayObj, keys, s); } } return keys; } private static void putNestedKeysToList(List keys, String key, String s) { if (!keys.contains(key + Constants.JSON_KEY_SPLITTER + s)) { keys.add(key + Constants.JSON_KEY_SPLITTER + s); } } private static boolean isNestedJsonAnObject(Object object) { boolean bool = false; if (object instanceof JSONObject) { bool = true; } return bool; } private static boolean isNestedJsonAnArray(Object object) { boolean bool = false; if (object instanceof JSONArray) { bool = true; } return bool; }