如何在Python中实现类estraverse的JSON节点遍历与函数执行?
实现类似estraverse的JSON节点遍历工具(Python版)
直接给你写一个通用的JSON节点遍历函数,能递归遍历每个节点并执行你自定义的逻辑,完全满足你要检查JSXText类型节点的需求:
核心遍历函数
def traverse(node, callback): # 先对当前节点执行回调 callback(node) # 处理对象类型(dict),遍历所有值 if isinstance(node, dict): for value in node.values(): traverse(value, callback) # 处理数组类型(list),遍历每个元素 elif isinstance(node, list): for item in node: traverse(item, callback) # 基础类型(字符串、数字、布尔、None)无需继续遍历 else: pass
你的需求示例:检查JSXText节点
接下来写你需要的自定义回调函数,筛选type为JSXText且value非空的节点并打印:
def jsx_text_callback(node): # 只处理dict类型的节点(因为有type和value属性) if isinstance(node, dict): node_type = node.get("type") node_value = node.get("value", "").strip() if node_type == "JSXText" and node_value: print(f"找到非空JSXText内容:{node_value}")
调用示例
假设你有这样的JSON对象(模拟AST结构):
sample_ast = { "type": "JSXElement", "children": [ {"type": "JSXText", "value": " 这是一段文本 "}, {"type": "JSXElement", "children": [{"type": "JSXText", "value": ""}]}, {"type": "JSXText", "value": "另一段非空文本"} ] } # 执行遍历 traverse(sample_ast, jsx_text_callback)
运行后会输出:
找到非空JSXText内容:这是一段文本 找到非空JSXText内容:另一段非空文本
扩展说明
- 如果需要控制遍历流程(比如找到目标节点后停止遍历,或者跳过某个节点的子节点),可以让回调函数返回一个控制信号,比如返回
False停止遍历,返回skip跳过子节点,修改遍历函数即可:def traverse(node, callback): result = callback(node) if result == "stop": return False if result == "skip": return True if isinstance(node, dict): for value in node.values(): if not traverse(value, callback): return False elif isinstance(node, list): for item in node: if not traverse(item, callback): return False return True - 这个工具和estraverse的核心逻辑一致:深度优先遍历每个节点,允许你在每个节点上执行自定义操作,完全适配你的JSON/AST节点检查需求。
内容的提问来源于stack exchange,提问作者Big boy
相关产品推荐
相关产品推荐

