关于java:使用keySet()从JSONObject提取密钥

Extracting Keys from a JSONObject using keySet()

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
 "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对象中提取密钥,并按如下方式进行:

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

问题是无法找到合适的变量类型,在其中我可以存储从keyset()方法获得的结果。

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

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

谢谢。


Javadoc说:

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

因此,JSONObject是一个Map,其键的类型为String,其值的类型为JSONValue

Map.keySet()的javadoc说:

1
2
3
Set<K> keySet()

Returns a Set view of the keys contained in this map

因此,JSONObject.keySet()返回的是Set(这很合逻辑,因为JSON对象的键是字符串)。

因此,您所需要做的就是:

1
Set<String> keys = posts.keySet();


posts代表JSONObjectMap,其中keyString

1
2
3
4
5
6
7
8
9
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);

输出:

1
[3116902311, 3114564209, 3111623007]


这对我有用

o是一个JSONObject-> import org.json.simple.JSONObject;

1
2
3
4
5
6
7
8
Set< ? > s =  o.keySet();

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

    }while(i.hasNext());

用于从json对象和数组中提取键的递归方法(如果重复项将合并它们,因为方法会返回Set,而不是Array)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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;
}