10

我正在尝试从 JSON 对象中提取密钥。在这种情况下,JSON 对象是通过对名为SkyRock的社交网站的 API 调用获得的,如下所示:

{
  "max_page": 2,
  "posts":  {
    "3111623007":  {
      "id_post": 3111623007,
      "media_align": "float_left",
      "tags":  [],
      "nb_comments": 24
    },
    "3114564209":  {
      "id_post": 3114564209,
      "media_align": "float_left",
      "tags":  [],
      "nb_comments": 33
    },
    "3116902311":  {
      "id_post": 3116902311,
      "media_align": "float_left",
      "tags":  [],
      "nb_comments": 29
    }
  }
}

我基本上想将所有post_id值存储在 ArrayList 中。为了做到这一点,我试图从 JSON 对象中提取密钥,并按如下方式执行此操作:

JSONObject posts = (JSONObject) jo.get("posts");
ArrayList<String> keys = (ArrayString<String>) posts.keyset();

问题是我找不到合适的变量类型来存储从keyset()方法获得的结果。

我尝试搜索答案,但在大多数情况下,keys()被用于提取密钥(由于某种原因无法使用,我认为这可能是因为正在使用 org.json.simple,但我没有把握)。

任何人都可以在这里帮助我找到问题的解决方案或任何替代方法来检索键值吗?

谢谢。

4

6 回答 6

19

javadoc说:

public interface JsonObject
extends JsonStructure, Map<String,JsonValue>

所以,一个 JSONObject 是一个 Map ,它的键是 type String,它的值是 type JSONValue

并且javadocMap<K, V>.keySet()说:

Set<K> keySet()

Returns a Set view of the keys contained in this map

所以,JSONObject.keySet()返回的是 a Set<String>(这很合乎逻辑,因为 JSON 对象的键是字符串)。

所以你想要的只是:

Set<String> keys = posts.keySet();
于 2013-10-05T08:18:17.420 回答
7

where的posts代表Map是_JSONObjectkeyString

JSONObject mainObject = new JSONObject(jsonString);

JSONObject posts = mainObject.getJSONObject("posts");

Map<String, JSONObject> map = (Map<String,JSONObject>)posts.getMap();

ArrayList<String> list = new ArrayList<String>(map.keySet());

System.out.println(list);

输出:

[3116902311, 3114564209, 3111623007]
于 2013-10-05T08:17:18.283 回答
7

这对我有用

o 是一个 JSONObject -> 导入 o​​rg.json.simple.JSONObject;

Set<?> s =  o.keySet();

    Iterator<?> i = s.iterator();
    do{
        String k = i.next().toString();
        System.out.println(k);

    }while(i.hasNext());
于 2016-12-14T14:45:06.560 回答
0

从 json 对象和数组中提取键的递归方法(如果方法返回 Set,但不返回 Array,如果重复将合并它们)

public static Set<String> getAllKeys(JSONObject json) {
    return getAllKeys(json, new HashSet<>());
}

public static Set<String> getAllKeys(JSONArray arr) {
    return getAllKeys(arr, new HashSet<>());
}

private static Set<String> getAllKeys(JSONArray arr, Set<String> keys) {
    for (int i = 0; i < arr.length(); i++) {
        Object obj = arr.get(i);
        if (obj instanceof JSONObject) keys.addAll(getAllKeys(arr.getJSONObject(i)));
        if (obj instanceof JSONArray) keys.addAll(getAllKeys(arr.getJSONArray(i)));
    }

    return keys;
}

private static Set<String> getAllKeys(JSONObject json, Set<String> keys) {
    for (String key : json.keySet()) {
        Object obj = json.get(key);
        if (obj instanceof JSONObject) keys.addAll(getAllKeys(json.getJSONObject(key)));
        if (obj instanceof JSONArray) keys.addAll(getAllKeys(json.getJSONArray(key)));
    }

    keys.addAll(json.keySet());
    return keys;
}
于 2016-10-13T19:35:17.873 回答
-2

在这里,您可以创建 json 对象,然后使用 jsonOject.keys() 检索密钥,然后您将获得这里的迭代器,如果您有静态密钥,我们将 jsonOject.keys() 用于动态密钥,那么您知道密钥的名称,但如果您不知道about key 然后用这个方法

    val mainObject = JSONObject(jsonString)
    val posts = mainObject.getJSONObject("posts")
    var list = ArrayList<Objects>()
    val map = posts.keys()
    while (map.hasNext()) {
        var key = map.next().toString()
        var jsonObject = posts.getJSONObject(key)
        val gson = Gson()
        val kk: Objects = gson.fromJson(jsonObject.toString(), Objects::class.java)
        list.add(kk)
        Log.e("key", key)
    }
于 2021-01-23T05:11:30.350 回答
-2

我的 JSONOject 是 jsonOject;

  Iterator <String> listKEY = jsonOject.keys();
                do {
              String newKEY = listKEY.next().toString();
                   
                }while (listKEY.hasNext());
于 2020-02-07T14:13:45.280 回答