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

12voto

Burrito Points 861

Org.json.JSONObject dispose désormais d'une méthode keySet() qui renvoie un objet de type Set<String> et peuvent facilement être parcourus en boucle avec un for-each.

for(String key : jsonObject.keySet())

7voto

Shekhar Points 365

La plupart des réponses données ici concernent des structures JSON plates. Si vous avez un JSON qui peut contenir des JSONArrays ou des JSONObjects imbriqués, la vraie complexité apparaît. L'extrait de code suivant répond à une telle exigence professionnelle. Il prend une carte de hachage et un JSON hiérarchique contenant à la fois des JSONArrays et des JSONObjects imbriqués et met à jour le JSON avec les données de la carte de hachage.

public void updateData(JSONObject fullResponse, HashMap<String, String> mapToUpdate) {

    fullResponse.keySet().forEach(keyStr -> {
        Object keyvalue = fullResponse.get(keyStr);

        if (keyvalue instanceof JSONArray) {
            updateData(((JSONArray) keyvalue).getJSONObject(0), mapToUpdate);
        } else if (keyvalue instanceof JSONObject) {
            updateData((JSONObject) keyvalue, mapToUpdate);
        } else {
            // System.out.println("key: " + keyStr + " value: " + keyvalue);
            if (mapToUpdate.containsKey(keyStr)) {
                fullResponse.put(keyStr, mapToUpdate.get(keyStr));
            }
        }
    });

}

Il faut noter que le type de retour de cette fonction est void, mais comme les objets sont passés en tant que référence, cette modification est renvoyée à l'appelant.

6voto

Ebrahim Byagowi Points 1105

D'abord, mets ça quelque part :

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

Ou si vous avez accès à Java8, juste ceci :

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

Ensuite, il suffit d'itérer sur les clés et les valeurs de l'objet :

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

6voto

JB Nizet Points 250258

Voir la documentation sur l'API : http://www.json.org/javadoc/org/json/JSONObject.html#keys%28%29

Ceci renvoie un itérateur sur les clés de l'objet.

2voto

Skullbox Points 44

J'ai créé une petite fonction récursive qui parcourt tout l'objet json et enregistre le chemin de la clé et sa valeur.

// My stored keys and values from the json object
HashMap<String,String> myKeyValues = new HashMap<String,String>();

// Used for constructing the path to the key in the json object
Stack<String> key_path = new Stack<String>();

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

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