在JSON中查找深度嵌套的键/值

3
假设我有一个像这样的JSON数组:
[
    {
        "id": "429d30a1-9364-4d9a-92e0-a17e00b3afba",
        "children": [],
        "parentid": "",
        "name": "Expo Demo"
    }, 
    {
        "id": "f80f1034-9110-4349-93d8-a17e00c9c317",
        "children": 
            [
                {
                    "id":"b60f2c1d-368b-42c4-b0b2-a1850073e1fe", 
                    "children":[], 
                    "parentid":"f80f1034-9110-4349-93d8-a17e00c9c317", 
                    "name":"Tank"
                }
            ],
        "parentid": "",
        "name": "Fishtank"
    }, 
    {
        "id": "fc8b0697-9406-4bf0-b79c-a185007380b8",
        "children": [
            {
                "id":"5ac52894-4cb6-46c2-a05a-a18500739193", 
                "children":[
                    {
                        "id": "facb264c-0577-4627-94a1-a1850073c270",
                        "children":[
                            {
                                "id":"720472b5-189e-47f1-97a5-a18500a1b7e9", 
                                "children":[], 
                                "parentid":"facb264c-0577-4627-94a1-a1850073c270", 
                                "name":"ubSubSub"
                            }],
                        "parentid": "5ac52894-4cb6-46c2-a05a-a18500739193",
                        "name": "Sub-Sub1"
                    }], 
                "parentid":"fc8b0697-9406-4bf0-b79c-a185007380b8", "name":"Sub"
            },
            {
                "id":"4d024610-a39b-49ce-8581-a18500739a75", 
                "children":[], 
                "parentid":"fc8b0697-9406-4bf0-b79c-a185007380b8", 
                "name":"Sub2"
            }
        ],
        "parentid": "",
        "name": "Herman"
    }, 
    {
        "id": "a5b140c9-9987-4e6d-a883-a18c00726883",
        "children": [
            {
                "id":"fe103303-fd5e-4cd6-81a0-a18c00733737", 
                "children":[], 
                "parentid":"a5b140c9-9987-4e6d-a883-a18c00726883", 
                "name":"Contains Spaces"
            }],
        "parentid": "",
        "name": "Kiosk"
    }
]

我想根据 id 查找某个对象,一旦找到该对象,我需要它的子元素和所有子元素的子元素。

假设我要查找带有 id 4d024610-a39b-49ce-8581-a18500739a75 的元素。

这应该可以找到元素Sub2

现在应该显示所有子元素的 id,如下:

facb264c-0577-4627-94a1-a1850073c270
720472b5-189e-47f1-97a5-a18500a1b7e9

假设我要做
findElementsChildren("4d024610-a39b-49ce-8581-a18500739a75")

我猜这个问题有两个部分,第一部分是找到“父”元素,然后找到它的子元素的子元素的子元素等等。

非常感谢任何帮助!


我可以找到元素,但是我不确定如何找到它的子孙。这些子元素可能会无限嵌套。我之前在Javascript中也做过类似的事情。 - Harry
也许你可以尝试使用JsonPath库来查询结构? - Jonathan
JavaScript 的那个实际上只是在一个 JSON 数组/对象中找到一个嵌套深度的元素。这一步更进一步,找到它所有的子元素。我不知道该怎么做,所以算法…… - Harry
1
另一个很好遍历这种JSON“树”的库是JSON.Simple。对于每个JSONObject,您将进行递归调用,检查它是否具有给定的ID,如果是,则使用另一个递归调用返回其子项 - 如果需要的话。 - Paul
很好的问题,终于找到了与我的相似的JSON结构。您能否在这里发布一个真正的工作示例(您说一切都对您有效),因为在被接受的答案中没有element.get("children")方法。 - Arthur Kushman
2个回答

3
您可以使用递归来解决无限嵌套的问题。 使用Gson,代码如下所示(未经测试)。 其他库也会提供JsonElement等结构体。
private JsonElement findElementsChildren(JsonElement element, String id) {
    if(element.isJsonObject()) {
        JsonObject jsonObject = element.getAsJsonObject();
        if(id.equals(jsonObject.get("id").getAsString())) {
            return jsonObject.get("children");
        } else {
            return findElementsChildren(element.get("children").getAsJsonArray(), id);
        }
    } else if(element.isJsonArray()) {
        JsonArray jsonArray = element.getAsJsonArray();
        for (JsonElement childElement : jsonArray) {
            JsonElement result = findElementsChildren(childElement, id);
            if(result != null) {
                return result;
            }
        }
    }

    return null;
}

什么是JsonElement?一个JSONArray? - Harry
JsonElement 可以是任何东西,一个 JSON 对象、数组或原始类型(字符串、整数等)。 - Stefan Jansen
好的,我稍微改了一下,但基本上一样,而且运行得很好!谢谢 - Harry

0
根据Stefan Jansen的回答,我做了一些更改,现在是这样的:
nestedChildren全局声明,在搜索子项之前重置为新的ArrayList()。
private void findAllChild(JSONArray array) throws JSONException {

    for ( int i=0;i<array.length();i++ ) {
        JSONObject json = array.getJSONObject(i);
        JSONArray json_array = new JSONArray(json.getString("children"));
        nestedChildren.add(json.getString("id"));
        if ( json_array.length() > 0 ) {
            findAllChild(json_array);
        }
    }
}

这假设所有的数据都是数组,而在我的情况下确实如此


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接