如何在JSON中用AND,OR稳健地描述条件表达式?

lic*_*hgo 9 json expression logical-operators comparison-operators

说我有一个表达式:

( A >= 10 && B == 20 ) || ( C < 30 ) || ( D != 50 )
Run Code Online (Sandbox Code Playgroud)

我可以建议以下JSON来存储/表示这个表达式:

{ "filter": 
    [
        { "var":"A", "condition":"ge", "num":10 },
        { "var":"B", "condition":"e", "num":20 }
    ],
    [
        { "var":"C", "condition":"lt", "num":30 }
    ],
    [
        { "var":"D", "condition":"ne", "num":50 }
    ]
}
Run Code Online (Sandbox Code Playgroud)

其中"filter"映射到子数组的数组.每个子阵列中的所有元素都与AND相关联,而所有子阵列都与OR相关联.

在编写像这样的JSON时,有什么我忽略的吗?

Zer*_*eus 12

你在这里做了几个假设:

  1. 比较将始终在变量和数字之间,并且永远不会在两个变量或两个数字之间.
  2. 变量将始终位于比较的左侧,而数字位于右侧.

这些假设对于您的特定用例可能是正确的,但更加面向未来的方法是将参数处理与具有参数的函数类似:

{ "ge": ["A", 10] }
Run Code Online (Sandbox Code Playgroud)

此外,虽然您使用对象数组表示AND和数组数组来表示OR的想法很聪明,但对于负责编写代码来解析它的人来说可能并不是很明显.重用一个对象的概念,其中键表示一个函数及其相关值,参数更具表现力:

{ "all": [<condition 1>, <condition 2>, ...] }
Run Code Online (Sandbox Code Playgroud)

把这两个想法放在一起,我们得到这样的东西:

{ "any": [
    { "all": [
        { "ge": ["A", 10] },
        { "eq": ["B", 20] }
    ]},
    { "lt": ["C", 30] },
    { "ne": ["D", 50] }
]}
Run Code Online (Sandbox Code Playgroud)