我使用一个名为JSONObject的JSON库(如果需要,我不介意切换)。

我知道如何遍历JSONArrays,但当我从Facebook解析JSON数据时,我没有得到一个数组,只有一个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
   }
}

当前回答

使用Java 8和lambda,更清晰:

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-

其他回答

首先把这个放在某个地方:

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);
    // ...

我们使用下面的一组代码遍历JSONObject字段

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

while (iterator.hasNext())  {
        Entry<String, JsonElement> entry = (Entry<String, JsonElement>) iterator.next();
        processedJsonObject.add(entry.getKey(), entry.getValue());
}

jsonobject现在有一个keySet()方法,它返回一个Set<String>,可以很容易地通过for-each循环。

for(String key : jsonObject.keySet())
Iterator<JSONObject> iterator = jsonObject.values().iterator();

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

 // Do whatever you want with jsonChildObject 

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

对于我的案例,我发现迭代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)));
}