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

How to robustly describe conditional expressions with AND, OR in JSON?

假设我有一个表达式:

( A >= 10 && B == 20 ) || ( C < 30 ) || ( D != 50 )

我可以建议以下 JSON 到 store/represent 这个表达式:

{ "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 }
    ]
}

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

我在写这样的 JSON 时有没有忽略什么?

你在这里做了几个假设:

  1. 比较总是在一个变量和一个数字之间进行,而不是在两个变量或两个数字之间进行。
  2. 变量总是在比较的左边,数字在右边。

对于您的特定用例,这些假设可能是正确的,但更适合未来的方法是将比较与带参数的函数类似地处理:

{ "ge": ["A", 10] }

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

{ "all": [<condition 1>, <condition 2>, ...] }

将这两个想法放在一起,我们得到如下结果:

{ "any": [
    { "all": [
        { "ge": ["A", 10] },
        { "eq": ["B", 20] }
    ]},
    { "lt": ["C", 30] },
    { "ne": ["D", 50] }
]}