2015-03-29 21 views
7

che ho un espressione:Come descrivere in modo solido le espressioni condizionali con AND, OR in JSON?

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

posso suggerire la seguente JSON per memorizzare/rappresentare questa espressione:

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

in cui "filtro" mappe in una matrice di sub-array. Tutti gli elementi di ogni sotto-matrice sono associati a AND, mentre tutti i sotto-array sono associati con OR.

C'è qualcosa che ho trascurato scrivendo il JSON in questo modo?

+0

sembra abbastanza buono per una rappresentazione in json. –

+2

Cosa succede se si ha 'A

risposta

12

Stai facendo un paio di ipotesi qui:

  1. confronti saranno sempre essere tra una variabile e un numero, e mai tra due variabili o due numeri.
  2. La variabile sarà sempre sul lato sinistro del confronto e il numero sulla destra.

quelle ipotesi possono essere corrette per il vostro particolare caso d'uso, ma una prova di futuro approccio più sarebbe quello di trattare i confronti in modo simile a funzioni con argomenti:

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

Inoltre, mentre la vostra idea di utilizzare un una serie di oggetti per rappresentare AND e una matrice di matrici per rappresentare l'OR è intelligente, potrebbe non essere immediatamente ovvio per un essere umano che ha il compito di scrivere codice per analizzarlo. Riutilizzo l'idea di un oggetto in cui la chiave rappresenta una funzione e il suo valore associato agli argomenti è più espressivo:

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

Mettendo queste due idee insieme, otteniamo qualcosa di simile:

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

Mi piace usare _any_ e _or_ per rappresentare gli operatori _or_ e _and_. _none_ potrebbe essere introdotto anche, se necessario. _none_ farebbe il lavoro di _non_ se avesse un figlio, o di _nor_ con più figli. –

+1

Grazie, Zero! È pulito ed efficiente Usando il tasto "any" e "all", scrivere codice per analizzare in modo ricorsivo il JSON è facile. – lichgo

+0

@lichgo è un'altra utile caratteristica di scrivere in questo modo, sì :-) Sono contento di sentire la mia risposta che ti ha aiutato ... –