使用keySet()从JSONObject中提取键

时间:2013-10-05 08:07:56

标签: java json

我正在尝试从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()方法获得的结果。

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

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

感谢。

6 个答案:

答案 0 :(得分:13)

The javadoc说:

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

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

javadoc of Map<K, V>.keySet()说:

Set<K> keySet()

Returns a Set view of the keys contained in this map

那么,JSONObject.keySet()返回的是Set<String>(这是非常合乎逻辑的,因为JSON对象的键是字符串)。

所以你想要的只是:

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

答案 1 :(得分:5)

posts代表Map的{​​{1}},其中JSONObjectkey

String

输出:

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

答案 2 :(得分:4)

这对我有用

o是JSONObject - &gt; import org.json.simple.JSONObject;

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

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

    }while(i.hasNext());

答案 3 :(得分: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;
}

答案 4 :(得分:-1)

我的JSONOject是jsonOject;

  Iterator <String> listKEY = jsonOject.keys();
                do {
              String newKEY = listKEY.next().toString();
                   
                }while (listKEY.hasNext());

答案 5 :(得分:-1)

<块引用>

在这里,您可以创建 json 对象,然后使用 jsonOject.keys() 检索密钥,您将获得此处的迭代器,如果您有静态密钥,则我们使用 jsonOject.keys() 作为动态密钥,那么您就知道密钥的名称,但如果您不知道不知道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)
    }