将JSON逻辑遍历成语句

Traverse JSON logic into a statement

JSON 输入为:

{
  "AND": 
     [ 
       {"OR": [ { "EQUALS" : {"X":"Y"} }, { "EQUALS": {"Z":"W"} } ]},
       {"EQUALS" : {"A": "B"} } 
     ]
}

EQUALS 取一对
AND - OR 取一个列表

               AND
             /    \
            OR     EQ
            / \    / \
           EQ  EQ  A B
           / \ / \
          X  Y Z  W

遍历后的输出应该是:

( A EQUALS B AND ( X EQUALS Y OR Z EQUALS W ) )

理论上我理解我应该将 JSON 作为一棵树并以有序(左-根-右)方法遍历它。

实际上,我实现了接受树的有序方法(标记有根和左右......尽可能深)。但是,我似乎无法正确理解如何将 JSON 作为一棵树来阅读并标记其内容,如果这是正确的想法!

有什么想法吗?

的确,你可以使用中序遍历。使用递归,它可能看起来像这样:

def dfs(node):
    key, value = list(node.items())[0]
    if isinstance(value, list):
        yield "("
        yield from dfs(value[0])
        yield ")"
        yield key
        yield "("
        yield from dfs(value[1])
        yield ")"
    else:
        a, b = list(value.items())[0]
        if isinstance(b, (list, dict)):
            yield key
            yield "("
            yield from dfs(value)
            yield ")"
        else:
            yield a
            yield key
            yield b

使用示例:

tree = {
    "NOT": {
        "AND": [{
            "OR": [{
                "NOT": {
                    "EQUALS" : {"X":"Y"}
                } 
            }, {
                "EQUALS": {"Z":"W"}
            }]
        }, {
            "EQUALS" : {"A": "B"}
        }]
    }
}

print(" ".join(dfs(tree)))

此示例的输出:

NOT ( ( ( NOT ( X EQUALS Y ) ) OR ( Z EQUALS W ) ) AND ( A EQUALS B ) )