Как перебрать JSONObject? - PullRequest
       18

Как перебрать JSONObject?

281 голосов
/ 05 февраля 2012

Я использую библиотеку JSON под названием JSONObject (я не против переключения, если мне нужно).

Я знаю, как перебрать JSONArrays, но когда я анализирую данные JSON из Facebook, я не получаю массив, только JSONObject, но мне нужно иметь возможность доступа к элементу через его индекс, например, как JSONObject[0], чтобы получить первый, и я не могу понять, как это сделать.

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

Ответы [ 13 ]

552 голосов
/ 15 мая 2012

Может быть, это поможет:

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      
    }
}
79 голосов
/ 22 сентября 2014

для моего случая я обнаружил, что итерация names() хорошо работает

for(int i = 0; i<jobject.names().length(); i++){
    Log.v(TAG, "key = " + jobject.names().getString(i) + " value = " + jobject.get(jobject.names().getString(i)));
}
44 голосов
/ 05 сентября 2015

Я буду избегать итераторов, поскольку они могут добавлять / удалять объекты во время итерации, также для чистого использования кода в цикле.это будет просто чисто и меньше строк.

Использование Java 8 и Lamda [Обновление 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);
    });
}

Использование старого способа [Обновление 04.02.2017]

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

Оригинальный ответ

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);
    }
}
23 голосов
/ 12 ноября 2017

Не могу поверить, что нет более простого и безопасного решения, чем использование итератора в этих ответах ...

JSONObject names () метод возвращает JSONArray из JSONObject ключей, так что вы можете просто ходить по нему в цикле:

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

}
17 голосов
/ 26 мая 2014
Iterator<JSONObject> iterator = jsonObject.values().iterator();

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

 // Do whatever you want with jsonChildObject 

  String id = (String) jsonChildObject.get("id");
}
7 голосов
/ 12 января 2018

org.json.JSONObject теперь имеет метод keySet (), который возвращает Set<String> и может быть легко перебран с помощью for-each.

for(String key : jsonObject.keySet())
6 голосов
/ 20 февраля 2016

Сначала положите это куда-нибудь:

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

Или, если у вас есть доступ к Java8, просто так:

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

Затем просто переберите ключи и значения объекта:

for (String key : iteratorToIterable(object.keys())) {
    JSONObject entry = object.getJSONObject(key);
    // ...
3 голосов
/ 07 февраля 2015

Я создал небольшую рекурсивную функцию, которая проходит через весь объект json и сохраняет путь к ключу и его значение.

// 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();
    }
}
2 голосов
/ 15 февраля 2017

С Java 8 и лямбда, очиститель:

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-

1 голос
/ 04 января 2019

Мы использовали приведенный ниже набор кода для итерации по JSONObject полям

Iterator iterator = jsonObject.entrySet().iterator();

while (iterator.hasNext())  {
        Entry<String, JsonElement> entry = (Entry<String, JsonElement>) iterator.next();
        processedJsonObject.add(entry.getKey(), entry.getValue());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...