python-3.x 根据用户输入从json中提取节点

kb5ga3dv  于 2022-11-19  发布在  Python
关注(0)|答案(1)|浏览(155)

我需要根据用户传递的节点链从给定的json中提取对象,忽略那些不在用户输入中的,然后创建一个新的json对象。
我的主人Json是:

{
    "menustructure": 
    [
            {
             "node":"Admin",
             "path":"admin",
                "child":[
                        {
                            "node": "Admin.resouce1",
                            "path":"resouce1",
                            "rank":1
                         },
                    
                        {"node":"Admin.resouce2",
                            "path": "oath",
                            "rank":2
                        }
                       ]
            },
            {
                "node":"Workspace",
                "path": "wsp",
                "child":[{
                        "node": "Workspace.system1",
                        "path":"sys1"
                    
                    },
                    {
                        "node": "Workspace.system2",
                        "path":"sys2"
                    }
                ]
            }

        
    ]
}

例如,如果用户传递['Admin.resource1', 'Workspace'],则预期的输出json将是注意,用户输入的列表的元素中的“.”意味着节点具有子节点,并且新的json将具有包括父节点细节的所有那些子节点细节。

{
    "menustructure": 
    [
            {
             "node":"Admin",
             "path":"admin",
                "child":[
                        {
                            "node": "Admin.resouce1",
                            "path":"resouce1",
                            "rank":1
                         }
                       ]
            },
            {
                "node":"Workspace",
                "path": "wsp",
                "child":[{
                        "node": "Workspace.system1",
                        "path":"sys1"
                    
                    },
                    {
                        "node": "Workspace.system2",
                        "path":"sys2"
                    }
                ]
            }

        
    ]
}

或者另一个例子是:['Admin.resouce2', 'workspace.system1'],则预期的json将为:

{
    "menustructure": 
    [
            {
             "node":"Admin",
             "path":"admin",
                "child":[
                        
                        {"node":"Admin.resouce2",
                            "path": "oath",
                            "rank":2
                        }
                       ]
            },
            {
                "node":"Workspace",
                "path": "wsp",
                "child":[{
                        "node": "Workspace.system1",
                        "path":"sys1"
                    
                    }
                ]
            }
    ]
}

或者如果只有单个节点通过['Admin'],则输出json将是:

{
    "menustructure": 
    [
            {
             "node":"Admin",
             "path":"admin",
                "child":[
                        {
                            "node": "Admin.resouce1",
                            "path":"resouce1",
                            "rank":1
                         },
                    
                        {"node":"Admin.resouce2",
                            "path": "oath",
                            "rank":2
                        }
                       ]
            }   
    ]
}

任何帮助都将是伟大的。
我尝试的代码是:

master = json.loads(m)
menustruct = []
nde = ['Admin.resouce1', 'Workspace']
test_master = master['menustructure']
temp_json = test_master
print()

for n in nde:
    temp_data = None
    if "." in n:
        menu_series = n.split(".")
    for m in temp_json:
        temp_data = m
        if temp_data['node'] == menu_series[0]:
            for sub_child in temp_data['child']:
                if sub_child['id'] == menu_series[1]:
                    idx = temp_data['child'].index(sub_child)
                else:
                    temp_data['child'].remove(sub_child)
                #if menu_iter.has_next()
        menustruct.append(temp_data)

print(menustruct)

但它没有按预期工作,我在使用此代码时遇到的问题是,如果用户传递['Admin.resouce1', 'Admin.resouce2', 'Workspace'],则不会在Admin子级中追加任何数据,并且工作区会加载两次

[{'node': 'Admin', 'path': 'admin', 'child': []}, {'node': 'Workspace', 'path': 'wsp', 'child': [{'node': 'Workspace.system1', 'path': 'sys1'}, {'node': 'Workspace.system2', 'path': 'sys2'}]}, {'node': 'Admin', 'path': 'admin', 'child': []}, {'node': 'Workspace', 'path': 'wsp', 'child': [{'node': 'Workspace.system1', 'path': 'sys1'}, {'node': 'Workspace.system2', 'path': 'sys2'}]}, {'node': 'Admin', 'path': 'admin', 'child': []}, {'node': 'Workspace', 'path': 'wsp', 'child': [{'node': 'Workspace.system1', 'path': 'sys1'}, {'node': 'Workspace.system2', 'path': 'sys2'}]}]

而且,如果有子孩子的子孩子,这个代码是不理想的。

相关问题