2015-03-29 45 views
7

że mam wyrażenie:Jak poprawnie opisać wyrażenia warunkowe za pomocą AND, OR w JSON?

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

mogę zaproponować następujące JSON do przechowywania/reprezentują to wyrażenie:

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

w którym "Filter" mapy do tablicy tablic podrzędnych. Wszystkie elementy każdej z tablic podrzędnych są powiązane z AND, podczas gdy wszystkie podparary są powiązane z OR.

Czy jest coś, co przeoczyłem, pisząc JSON w ten sposób?

+0

wydaje się dość dobry dla reprezentacji w json. –

+2

Co jeśli masz "A

Odpowiedz

12

Robisz kilka założeń tutaj:

  1. Porównania zawsze będzie wynosić od zmiennej i numer, a nie między dwiema zmiennymi lub dwóch liczb.
  2. Zmienna będzie zawsze po lewej stronie porównania, a liczba po prawej stronie.

Założenia te mogą być poprawne dla danego przypadku użycia, ale bardziej przyszłościowe podejście byłoby traktować porównań podobnie do funkcji z argumentami:

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

Również podczas swojej idei stosując Tablica obiektów do reprezentowania AND i tablica tablic do reprezentowania OR jest sprytna, może nie być od razu oczywista dla człowieka, któremu zlecono pisanie kodu w celu przeanalizowania go. Ponowne użycie idei obiektu gdzie klucz reprezentuje funkcję i towarzyszące mu wartość argumentów jest bardziej wyraziste:

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

Umieszczenie tych dwóch pomysłów razem otrzymujemy coś takiego:

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

Podoba mi się użycie _any_ i _or_ do reprezentowania operatorów _lub_ i _i_. _none_ może również zostać wprowadzony, jeśli zajdzie taka potrzeba. _none_ wykonał by zadanie _nie_, gdyby miało jedno dziecko lub dziecko z wieloma dziećmi. –

+1

Dzięki, Zero! Jest czysty i wydajny. Za pomocą klawisza "any" i "all" pisanie kodu do rekurencyjnego analizowania JSON jest łatwe. – lichgo

+0

@lichgo to kolejna użyteczna funkcja pisania tego w ten sposób, tak :-) Cieszę się, że moja odpowiedź pomogła ci ... –