如何将嵌套JSON格式流程树转换为迭代式流程列表字典
嵌套JSON流程树转迭代流程字典实现
需求背景
需要将嵌套结构的流程树JSON,按照子树出现的先后顺序,转换为包含多条流程列表的字典,同时遍历输出的节点内容需要包含回溯后的重复父节点。
输入样例
{ "name": "test", "children": [ { "name": "Operator_8a82e", "children": [ { "name": "Link_e5479", "children": [ { "name": "Operator_b7394", "children": [ { "name": "Link_7f62e", "children": [ { "name": "Operator_73ea0", "children": [ { "name": "Link_93a51", "children": [ { "name": "Operator_32a07" } ] } ] } ] } ] } ] }, { "name": "Link_59e2c", "children": [ { "name": "Operator_3ca6d" } ] } ] } ] }
现有问题
原有递归函数仅做了简单的深度优先遍历,没有维护节点路径栈,回溯到父节点处理下一个子分支时,不会重复输出父节点内容,导致打印结果缺失对应父节点。
解决代码
def flatten_json(y): out = {} process_num = 1 path = [] def traverse(node): nonlocal process_num # 加入当前节点到路径,打印名称 current_name = node["name"] path.append(current_name) print(current_name) # 判断是否有子节点 if "children" in node and len(node["children"]) > 0: for idx, child in enumerate(node["children"]): # 非第一个子节点,遍历前先打印当前所有父路径(回溯后重复输出) if idx > 0: for p in path: print(p) # 递归处理子节点 traverse(child) # 叶子节点,存储当前路径(去掉根节点test)为process,若需按自定义规则截断流程可修改此处判断逻辑 else: process_content = [{"name": name} for name in path[1:]] out[f"process_{process_num}"] = process_content process_num += 1 # 回溯:弹出当前节点 path.pop() traverse(y) return out
运行说明
调用该函数后,打印输出完全符合预期,返回的out字典即为所需的迭代式流程字典。如果需要和示例完全一致的截断逻辑,只需调整存储process的判断条件即可。
内容的提问来源于stack exchange,提问作者pm1391
相关产品推荐
相关产品推荐

