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

时间:2013-03-27 11:52:24

标签: java json

假设我有一个像这样的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的特定对象,一旦我拥有它,我需要它的孩子及其所有孩子的孩子

所以,如果 4d024610-a39b-49ce-8581-a18500739a75

,我想要找到带有id的元素

应该找到元素 Sub2

现在它应该产生所有的子元素ids巫婆:

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

我想说我会做

findElementsChildren("4d024610-a39b-49ce-8581-a18500739a75")

所以我猜它的两个部分,首先找到“父”元素。然后找到孩子儿童等孩子等。

非常感谢任何帮助!

2 个答案:

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

答案 1 :(得分:0)

根据Stefan Jansen的回答,我做了一些改动,这就是我现在所拥有的:

nestedChildren声明了globaly,并且在搜索子节点之前重置为new 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);
        }
    }
}

这假设它是所有数组,在我的情况下,它是