2015-03-29 5 views
7

Скажем, у меня есть выражение:Как правильно описать условные выражения с помощью AND, OR в JSON?

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

Я могу предложить следующий 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 } 
    ] 
} 

, в котором «фильтр» карты на массив подмассивов. Все элементы в каждом вспомогательном массиве связаны с AND, а все подмассивы связаны с OR.

Есть ли что-нибудь, что я забыл в письменной форме JSON?

+0

выглядит довольно хорошо для представления в json. –

+2

Что делать, если у вас есть 'A

ответ

12

Вы делаете несколько предположений здесь:

  1. Сравнения будет всегда находиться между переменной и числом, и никогда между двумя переменными или двумя числами.
  2. Переменная всегда будет находиться в левой части сравнения, а число справа.

Эти предположения могут быть правильными для вашего конкретного случая использования, но более перспективное подход будет рассматривать сравнения аналогично функции с аргументами:

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

Кроме того, в то время как ваш идея использования массив объектов для представления И и массив массивов для представления ИЛИ является умным, это может быть не сразу очевидным для человека, которому поручено писать код для его анализа. Повторное представление объекта, где ключ представляет функцию и связанное с ним значением аргументов более выразительно:

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

Положив эти две идеи вместе, мы получаем что-то вроде этого:

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

Мне нравится использование _any_ и _or_ для представления операторов _or_ и _and_. _none_ также может быть введен, если это необходимо. _none_ выполнил бы работу _not_, если у него был один ребенок, или из _nor_ с несколькими дочерними элементами. –

+1

Спасибо, нуль! Он чист и эффективен. Используя ключ «any» и «all», писать код для рекурсивного анализа JSON легко. – lichgo

+0

@lichgo это еще одна полезная особенность написания этого способа, да :-) Рад слышать, что мой ответ помог вам ... –