求助:基于用户节点链提取JSON菜单结构节点并生成新JSON
从主JSON中按指定节点链提取对象
需求说明
根据用户传入的节点链列表,从给定的主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']:保留Admin节点及其子节点Admin.resouce1,完整保留Workspace节点; - 传入
['Admin.resouce2', 'Workspace.system1']:保留Admin节点及其子节点Admin.resouce2,保留Workspace节点及其子节点Workspace.system1; - 传入
['Admin']:完整保留Admin节点及其所有子节点。
尝试的代码(存在问题)
import json master = json.loads(m) menustruct = [] nde = ['Admin.resouce1', 'Workspace'] test_master = master['menustructure'] temp_json = test_master 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']: # 错误:子节点没有id字段,应该匹配node属性 if sub_child['id'] == menu_series[1]: idx = temp_data['child'].index(sub_child) else: temp_data['child'].remove(sub_child) menustruct.append(temp_data) print(menustruct)
现存问题
- 传入
['Admin.resouce1', 'Admin.resouce2', 'Workspace']时,Admin的子节点被错误清空,且Workspace节点被重复添加到结果中; - 代码仅支持单层子节点,无法处理多层嵌套的子子节点场景;
- 直接修改原JSON对象的
child列表,会破坏原始数据; - 未处理不包含
.的节点(如直接传入Admin)的逻辑。
内容的提问来源于stack exchange,提问作者vineet singh
相关产品推荐
相关产品推荐

