如何解析JSON逻辑结构并通过中序遍历生成对应逻辑表达式语句?
实现思路
- 先定义统一的树节点结构
所有节点统一抽象为包含left(左子节点/左值)、right(右子节点/右值)、val(当前节点操作符/内容)三个属性的结构,非叶子节点的left和right为子节点对象,叶子节点的left、right为具体的字段值字符串。 - 递归解析JSON生成树结构
输入的JSON是天然嵌套的结构,直接用递归方法逐层解析即可,解析逻辑按操作符类型区分:- 每次取当前JSON对象的唯一key,即为当前节点的操作符
val - 如果当前操作符是
AND/OR:它的参数是数组,数组的第一个元素递归解析后作为当前节点的left子节点,第二个元素递归解析后作为当前节点的right子节点;如果数组长度大于2,可两两递归组合生成嵌套的二元节点即可 - 如果当前操作符是
EQUALS:它的参数是长度为1的键值对,取键名作为当前节点的left值,键值作为当前节点的right值,不需要继续递归
- 每次取当前JSON对象的唯一key,即为当前节点的操作符
- 调用现有中序遍历方法输出结果
解析完成后得到的根节点直接传入你已经实现的中序遍历方法即可,遍历过程中每输出一个非叶子节点的逻辑结果,就用括号包裹,避免优先级错乱。
示例代码(Python)
class Node: def __init__(self, val, left=None, right=None): self.val = val self.left = left self.right = right def json_to_tree(json_obj): # 取当前对象唯一的key作为操作符 op = list(json_obj.keys())[0] params = json_obj[op] if op in ("AND", "OR"): # 二元逻辑操作符,左右子节点递归解析 left_node = json_to_tree(params[0]) right_node = json_to_tree(params[1]) # 如果要和你示例输出的顺序一致,把左右节点调换即可: # return Node(op, right_node, left_node) return Node(op, left_node, right_node) elif op == "EQUALS": # 等于操作符,左右为具体字段值 k = list(params.keys())[0] v = params[k] return Node(op, left=k, right=v) # 中序遍历生成逻辑语句的示例(可替换为你已实现的方法) def inorder_traverse(node): if isinstance(node.left, Node): left_str = inorder_traverse(node.left) else: left_str = str(node.left) if isinstance(node.right, Node): right_str = inorder_traverse(node.right) else: right_str = str(node.right) return f"({left_str} {node.val} {right_str})" # 测试 import json input_json = json.loads(''' { "AND": [ {"OR": [ { "EQUALS" : {"X":"Y"} }, { "EQUALS": {"Z":"W"} } ]}, {"EQUALS" : {"A": "B"} } ] } ''') root = json_to_tree(input_json) # 调换左右节点后输出和你预期完全一致的结果:( ( X EQUALS Y OR Z EQUALS W ) AND A EQUALS B ) print(inorder_traverse(root))
内容的提问来源于stack exchange,提问作者HanaTam
相关产品推荐
相关产品推荐

