411 Stimmen

Wie kann man über ein JSONObject iterieren?

Ich verwende eine JSON-Bibliothek namens JSONObject (Ich habe nichts dagegen, wenn ich wechseln muss).

Ich weiß, wie man über die folgenden Punkte iteriert JSONArrays aber wenn ich JSON-Daten von Facebook parse, erhalte ich kein Array, sondern nur ein JSONObject aber ich muss in der Lage sein, auf ein Element über seinen Index zuzugreifen, z. B. JSONObject[0] um die erste zu bekommen, und ich kann nicht herausfinden, wie man das macht.

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

15voto

Burrito Punkte 1273

Org.json.JSONObject hat jetzt eine keySet()-Methode, die eine Set<String> und kann leicht mit einem for-each durchgeschleift werden.

for(String key : jsonObject.keySet())

11voto

Shekhar Punkte 545

Die meisten Antworten hier beziehen sich auf flache JSON-Strukturen. Wenn Sie ein JSON haben, das verschachtelte JSONArrays oder verschachtelte JSONObjects haben könnte, wird es richtig komplex. Das folgende Codeschnipsel erfüllt eine solche Geschäftsanforderung. Er nimmt eine Hash-Map und hierarchisches JSON mit verschachtelten JSONArrays und JSONObjects und aktualisiert das JSON mit den Daten in der Hash-Map

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

}

Man muss hier beachten, dass der Rückgabetyp von this void ist, aber da Objekte als refernce übergeben werden, wird diese Änderung an den Aufrufer zurückgesendet.

7voto

Ebrahim Byagowi Punkte 8964

Legen Sie das zuerst irgendwo hin:

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

Oder, wenn Sie Zugang zu Java8 haben, einfach dies:

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

Iterieren Sie dann einfach über die Schlüssel und Werte des Objekts:

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

2voto

Skullbox Punkte 441

Ich habe eine kleine rekursive Funktion erstellt, die das gesamte json-Objekt durchläuft und den Schlüsselpfad und seinen Wert speichert.

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

2voto

Thomas Decaux Punkte 19874

Mit Java 8 und Lambda, sauberer:

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-

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X