如何在JSON树结构中建模布尔表达式

时间:2013-05-23 00:37:44

标签: json tree boolean

我花了几个小时在谷歌和堆栈溢出,但我还没有得出关于如何建模嵌套布尔数据的结论。

假设我有以下表达式:

123 and 321 and (18 or 19 and (20 or 21))

我如何在JSON树结构中对此进行建模,以便我可以通过简单地遍历树来重建上面的表达式?我不需要实际评估逻辑,而只是简单地构造它,以便以树形式描绘逻辑。

提前致谢。

为了记录,这是我想要完成的系统类型,以及我猜测应该根据下面的答案构建树。

ANY OF THESE:
    13
    14
    ALL OF THESE:
        18
        19
        20

          or
        /   \
       or   13
      /  \
    14    and
         /   \
       and   18
       / \
     20   19

2 个答案:

答案 0 :(得分:2)

考虑编程语言将评估语句部分的顺序。根据和和或的优先级以及它们的左右关联性,它必须选择一些“最深”的部分,并且必须首先进行评估,然后将其作为其完全评估的操作数之一给予其“父”(最接近的较少关联运算符),然后在评估它时具有父级,依此类推。

因此,在完全评估之后,您将拥有一个树到达根目录,并且叶节点是可以首先评估的表达式的一部分(不依赖于任何评估来得出结果)。

举个简单的例子,1 and (2 OR 3)将被建模为

  and
 /   \
1    or
    /  \
   2    3

如果从左到右评估具有相同优先级的运算符,并且AND的优先级高于OR(例如,在C ++中为true:http://en.cppreference.com/w/cpp/language/operator_precedence)则

123 and 321 and (18 or 19 and (20 or 21))

变为

        and
       /   \
    and     \
   /   \     \
123     321   \
               \
                or
               /  \
             18    and
                  /   \
                or     19
               /  \
             20    21

为了评估这棵树的结果,你首先评估最深处,用其当前运算符替换每个节点的结果,评估其左侧和右侧,直到根中只剩下一个数字。

要以编程方式从布尔表达式转换为布尔表达式树,您需要编写解析器*,例如在Python中,您可以使用PLY http://www.dabeaz.com/ply/编写它,并且每种语言都有不同的第三方解析器构造库是最受欢迎的。

答案 1 :(得分:1)

我的ConditionSet为json格式:

"FilterCondition": {
  "LogicalOperator": "AND",
  "Conditions": [
    {
      "Field": "age",
      "Operator": ">",
      "Value": "8"
    },
    {
      "LogicalOperator": "OR",
      "Conditions": [
        {
          "Field": "gender",
          "Operator": "=",
          "Value": "female"
        },
        {
          "Field": "occupation",
          "Operator": "IN",
          "Value": ["business","service"]
        }
      ]
    }
  ]
}

参考:https://zebzhao.github.io/Angular-QueryBuilder/demo/