377 votes

Comment itérer sur un JSONObject ?

J'utilise une bibliothèque JSON appelée JSONObject (Cela ne me dérange pas de changer si j'en ai besoin).

Je sais comment itérer sur JSONArrays mais lorsque j'analyse des données JSON provenant de Facebook, je n'obtiens pas de tableau, mais seulement un fichier JSONObject mais j'ai besoin de pouvoir accéder à un élément par son index, comme par exemple JSONObject[0] pour obtenir le premier, et je n'arrive pas à trouver comment le faire.

{
   "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
   }
}

1 votes

0 votes

662voto

rickey Points 1822

Peut-être que cela vous aidera :

JSONObject jsonObject = new JSONObject(contents.trim());
Iterator<String> keys = jsonObject.keys();

while(keys.hasNext()) {
    String key = keys.next();
    if (jsonObject.get(key) instanceof JSONObject) {
          // do something with jsonObject here      
    }
}

25 votes

Attention tout le monde, jObject.keys() retourne l'itérateur avec l'ordre inverse de l'index.

88 votes

@macio.Jun Néanmoins, l'ordre n'a pas d'importance dans les mappings de propriétés : les clés en JSONObject ne sont pas ordonnées et votre affirmation était un simple reflet d'une implémentation privée ;)

9 votes

Que faire quand on a besoin de toutes les clés séquentiellement ?

100voto

AssemblyX Points 641

Dans mon cas, j'ai trouvé qu'en itérant l names() fonctionne bien

for(int i = 0; i<jobject.names().length(); i++){
    Log.v(TAG, "key = " + jobject.names().getString(i) + " value = " + jobject.get(jobject.names().getString(i)));
}

1 votes

Bien que cet exemple ne soit pas vraiment compris comme Iterating en Java, cela fonctionne très bien ! Merci.

0 votes

Excellente réponse. Elle fonctionne parfaitement pour presque tous les types d'objets json imbriqués ou non. !

0 votes

Qu'est-ce que Log. v() ? A quelle bibliothèque appartient-il ?

78voto

mtariq Points 1194

J'éviterai les itérateurs car ils peuvent ajouter/supprimer des objets pendant l'itération, et pour un code plus propre, j'utiliserai des boucles.

Utilisation de Java 8 et de Lamda [Mise à jour 4/2/2019]

import org.json.JSONObject;

public static void printJsonObject(JSONObject jsonObj) {
    jsonObj.keySet().forEach(keyStr ->
    {
        Object keyvalue = jsonObj.get(keyStr);
        System.out.println("key: "+ keyStr + " value: " + keyvalue);

        //for nested objects iteration if required
        //if (keyvalue instanceof JSONObject)
        //    printJsonObject((JSONObject)keyvalue);
    });
}

Utilisation de l'ancienne méthode [Mise à jour 4/2/2019]

import org.json.JSONObject;

public static void printJsonObject(JSONObject jsonObj) {
    for (String keyStr : jsonObj.keySet()) {
        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);
    }
}

Réponse originale

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

69voto

Acuna Points 374

Je ne peux pas croire qu'il n'y ait pas de solution plus simple et plus sûre que l'utilisation d'un itérateur dans ces réponses...

JSONObject names () renvoie un JSONArray de la JSONObject de sorte que vous pouvez simplement le parcourir en boucle :

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

}

18voto

aviomaksim Points 763
Iterator<JSONObject> iterator = jsonObject.values().iterator();

while (iterator.hasNext()) {
 jsonChildObject = iterator.next();

 // Do whatever you want with jsonChildObject 

  String id = (String) jsonChildObject.get("id");
}

0 votes

jsonChildObject = iterator.next(); devrait probablement définir jsonChildObject comme JSONObject jsonChildObject = iterator.next(); Non ?

1 votes

J'aime cette solution, mais déclarer Iterator<JSONObject> donnera un avertissement. Je le remplacerais par le générique <?> et faire un casting sur l'appel à next() . Aussi, j'utiliserais getString("id") au lieu de get("id") pour éviter de faire un casting.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X