获取json中所有嵌套键的列表

2024-04-29 16:40:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个巨大的json格式如下:

{
    "Name1": {
        "NNum": "11",
        "Node1": {
            "SubNodeA": "Thomas",
            "SubNodeB": "27"
        },
        "Node2": {
            "SubNodeA": "ZZZ",
            "SubNodeD": "XXX",
            "SubNodeE": "yy"
        },
        "Node3": {
                "child1": 11,
                "child2": {
                    "grandchild": {
                        "greatgrandchild1": "Rita",
                        "greatgrandchild2": "US"
                                }
                            }   
                }
            }
}

格式或键未定义,可以扩展到任何深度 我想要一份钥匙清单

keyList= ["Name1.NNum","Name1.Node1.SubNodeA",""Name1.Node1.SubNodeB","Name1.Node2.SubNodeA","Name1.Node2.SubNodeD","Name1.Node2.SubNodeE","Name1.Node3.child1","Name1.Node3.child2.grandchild.greatgrandchild1","Name1.Node3.child2.grandchild.greatgrandchild2"]

代码的快照

def extract_values(obj):
    """Pull all values of specified key from nested JSON."""
    arr = []
    key_list = []
    parent = ""
    def extract(obj, arr,parent):
        """Recursively search for values of key in JSON tree."""
        if isinstance(obj, dict):
            grandparent = ""
            for k, v in obj.items():
                print ("k ............",k)
                parent = grandparent
                temp_parent = k
                print ("parent >>>>> ",parent)

                if isinstance(v, (dict, list)):
                    parent = temp_parent
                    print ("IF VALUE DICT .. parent ", parent)
                    extract(v, arr,parent)
                else:
                    grandparent = parent
                    parent = parent + "_" + temp_parent
                    print ("!!!!   NOT DICT :).... **** parent  ... ", parent)
                    arr.append(parent)

        elif isinstance(obj, list):
            for item in obj:
                extract(item, arr)
        #print ("arr >>>>>>>>>> ", arr)
        time.sleep(5)
        return arr

    results = extract(obj, arr,parent)
    return results

但这并没有给出预期的结果。 预期产量:

keyList= ["Name1.NNum","Name1.Node1.SubNodeA",""Name1.Node1.SubNodeB","Name1.Node2.SubNodeA","Name1.Node2.SubNodeD","Name1.Node2.SubNodeE","Name1.Node3.child1","Name1.Node3.child2.grandchild.greatgrandchild1","Name1.Node3.child2.grandchild.greatgrandchild2"]

谁能帮我一下吗。 提前谢谢


Tags: objextractparentprintarrname1node1node2
3条回答

您可以执行简单的递归:

d = {
    "Name1": {
        "NNum": "11",
        "Node1": {
            "SubNodeA": "Thomas",
            "SubNodeB": "27"
        },
        "Node2": {
            "SubNodeA": "ZZZ",
            "SubNodeD": "XXX",
            "SubNodeE": "yy"
        },
        "Node3": {
                "child1": 11,
                "child2": {
                    "grandchild": {
                        "greatgrandchild1": "Rita",
                        "greatgrandchild2": "US"
                                }
                            }
                }
            }
}

def get_keys(d, curr_key=[]):
    for k, v in d.items():
        if isinstance(v, dict):
            yield from get_keys(v, curr_key + [k])
        elif isinstance(v, list):
            for i in v:
                yield from get_keys(i, curr_key + [k])
        else:
            yield '.'.join(curr_key + [k])

print([*get_keys(d)])

印刷品:

['Name1.NNum', 'Name1.Node1.SubNodeA', 'Name1.Node1.SubNodeB', 'Name1.Node2.SubNodeA', 'Name1.Node2.SubNodeD', 'Name1.Node2.SubNodeE', 'Name1.Node3.child1', 'Name1.Node3.child2.grandchild.greatgrandchild1', 'Name1.Node3.child2.grandchild.greatgrandchild2']

这个怎么样?你知道吗

from collections import Mapping

def extract_paths(base_path, dd): 
    new_paths = [] 
    for key, value in dd.items(): 
        new_path = base_path + ('.' if base_path else '') + key 
        if isinstance(value, Mapping): 
            new_paths.extend(extract_paths(new_path, value)) 
        else: 
            new_paths.append(new_path) 
    return new_paths

extract_paths('', your_dict)
def getKeys(object, prev_key = None, keys = []):
    if type(object) != type({}):
        keys.append(prev_key)
        return keys
    new_keys = []
    for k, v in object.items():
        if prev_key != None:
            new_key = "{}.{}".format(prev_key, k)
        else:
            new_key = k
        new_keys.extend(getKeys(v, new_key, []))
    return new_keys

此解决方案假定可能具有子级的内部类型是字典。你知道吗

相关问题 更多 >