1

こんにちは皆さん、私はこれに数時間取り組んでいますが、この作業を完了することができないようです.

私はこのjson構造を持っています:

{
    "1": {
        "name": "foo",
        "color": "black",
        "children": ["2", "3"]
     },
    "2": {
        "name": "foo2",
        "color": "green",
        "children": []
     },
    "3": {
        "name": "foo3",
        "color": "yellow",
        "children": ["4"]
     },
    "4": {
        "name": "foo4",
        "color": "purple",
        "children": []
     }
}

そして、Python辞書を使用して次のjson構造にこれを変換したいと思います:

{
    "foo":{
        "color":"black",
        "children":{
            "foo2":{
                "color":"green",
                "children":{}
            },
            "foo3":{ 
                "color":"yellow",
                "children":{
                    "foo4":{
                        "color":"purple", 
                        "children":{}
                        }
                }
            }
        }
    }
}

誰かが私を助けてくれますか?

4

2 に答える 2

1

再帰は必要ありません。これを試してください(s元の文字列で):

>>> import json
>>> data = json.loads(s)
>>> for v in data.values():
    v['children'] = {data[c]['name']:data[c] for c in v['children']}


>>> d = {data['1']['name']:data['1']}
>>> for v in data.values():
    del v['name']


>>> print(json.dumps(d, indent=4))
{
    "foo": {
        "color": "black", 
        "children": {
            "foo2": {
                "color": "green", 
                "children": {}
            }, 
            "foo3": {
                "color": "yellow", 
                "children": {
                    "foo4": {
                        "color": "purple", 
                        "children": {}
                    }
                }
            }
        }
    }
}

そのため、データを 1 回パスして「ポインタ」を実際の子に置き換え、次に 2 回目のパスで名前を削除します。すべての辞書/リストはその場で変更されるため、リンクされた子は引き続き機能します。

于 2013-02-05T12:12:07.507 に答える
0

まず、dict が順序付けされていないことを知っておく必要があるため、反復中に取得する最初のキーが "1" であることを知ることはできません。常に "1" が最初の要素である場合:

dict_to_convert = {
    "1": {
        "name": "foo",
        "color": "black",
        "children": ["2", "3"]
    },
    "2": {
        "name": "foo2",
        "color": "green",
        "children": []
    },
    "3": {
        "name": "foo3",
        "color": "yellow",
        "children": ["4"]
    },
    "4": {
        "name": "foo4",
        "color": "purple",
        "children": []
    }
}


def convert_dict(dict_to_convert, key=None):
    if key is not None:
        new_dict = {}
        for key in dict_to_convert[key]["children"]:
            new_dict[dict_to_convert[key]["name"]] = {}
            new_dict[dict_to_convert[key]["name"]]["color"] = dict_to_convert[key]["color"]
            new_dict[dict_to_convert[key]["name"]]["children"] = convert_dict(dict_to_convert, key)
    else:
        new_dict = {}
        new_dict[dict_to_convert["1"]["name"]] = {}
        new_dict[dict_to_convert["1"]["name"]]["color"] = dict_to_convert["1"]["color"]
        new_dict[dict_to_convert["1"]["name"]]["children"] = convert_dict(dict_to_convert, "1")
    return new_dict


converted_dict = convert_dict(dict_to_convert)
print converted_dict

私はそれをチェックしました、それは動作します。

于 2013-02-05T12:35:54.310 に答える