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に基づいて特定のオブジェクトを検索したいのですが、それを取得したら、その子とそのすべての子の子が必要です。

したがって、 4d024610-a39b-49ce-8581-a18500739a75の場合、IDを持つ要素を検索するとします。

それは要素Sub2を見つけるはずです

そして今、それはすべての子要素を生成するはずですidswitchは次のようになります:

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

私がやろうとしましょう

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

したがって、その2つの部分を推測し、最初に「親」要素を見つけます。次に、そのchildrendschildrendschildrenなどを見つけます。

どんな助けでも大歓迎です!

4

2 に答える 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;
}
于 2013-03-27T12:16:40.220 に答える
0

Stefan Jansenの回答に基づいて、私はいくつかの変更を加えました。これが私が今持っているものです。

入れ子になったChildrenはグローバルに宣言され、子が検索される前に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);
        }
    }
}

これは、それがすべての配列であることを前提としています。私の場合は魔女です。

于 2013-03-27T12:43:44.783 に答える