我需要根据用户传递的节点链从给定的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'}]}]
而且,如果有子孩子的子孩子,这个代码是不理想的。
1条答案
按热度按时间nimxete21#
Glom正好解决了这个问题。