有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何遍历JSONObject(复杂)并选择keyvalue对并将其插入映射

我想写一段代码,可以迭代给定的JSONObject,只选择键值对并将其插入映射。 例如,这是我的JOSNObject->

{ "_id": { "docId": "123456" }, "meta": { "tId": "8267" }, "body": { "startDate": { "sdate": "2020-01-01T06:00:00Z" }, "endDate": { "edate": "2021-06-30T05:00:00Z" } } }

我只希望地图中有实际/有用的键值对,比如

"docId"="123456", "tId"="8267", "sdate"="2020-01-01T06:00:00Z" , "edate"="2021-06-30T05:00:00Z"

任何帮助都将不胜感激

为了让事情变得更清楚,我正在寻找一种解决方案或一种方法,可以在不显式指定键名的情况下获取JSONObject的值


共 (3) 个答案

  1. # 1 楼答案

    下面是一个递归解决方案:

    public static Map<String, Object> leafEntries(JSONObject jsonObject) {
        Map<String, Object> result = new HashMap<>();
        for (String key : jsonObject.keySet()) {
            Object nestedObject = jsonObject.get(key);
            if (nestedObject instanceof JSONObject)
                result.putAll(leafEntries((JSONObject) nestedObject));
            else
                result.put(key, nestedObject);
        }
        return result;
    }
    

    下面是一个单元测试(它通过了):

    @Test
    void test() {
        var jsonObject = new JSONObject("""
                {
                    "_id": { "docId": "123456" },
                    "meta": { "tId": "8267" },
                    "body": {
                        "startDate": { "sdate": "2020-01-01T06:00:00Z" },
                        "endDate": { "edate": "2021-06-30T05:00:00Z" }
                    }
                }""");
        assertThat(leafEntries(jsonObject)).containsOnly(
                entry("docId", "123456"),
                entry("tId", "8267"),
                entry("sdate", "2020-01-01T06:00:00Z"),
                entry("edate", "2021-06-30T05:00:00Z"));
    }
    

    (单元测试使用AssertJ库和Java 16语法,但生产函数与Java 8兼容。)

  2. # 2 楼答案

    也许你正在寻找这样的东西:

    JSONObject json = new JSONObject ("{\"hi\":\"hello\"}");
    for (Iterator i = json.keySet().iterator(); i.hasNext ();) {
        String key = (String) i.next ();
        Object val = json.get(key);
        // Write logic to select the fields you want
        // e.g. val instanceof String (for key with string value)
        System.out.println (val);
    }
    
  3. # 3 楼答案

    首先,使用地图名称调用 地图名。价值观() 这将向您返回一个值列表 然后你可以在这个列表上迭代 并在地图中插入值