Package: json-operations
json-operationsSpecify complex conditional operations in JSON. The conditional operations can be run securely
against a JSON value (Python dictionary) and will return a boolean.fromjson_operationsimportexecuteoperations=[">",["key","items"],30]data1={"items":31}data2={"items":29}execute(operations,data1)# -> Trueexecute(operations,data2)# -> FalseSecurityAll operations are safe (no use of eval). It's good to enforce a length limit if you are taking input
from an untrusted source.APIexecuteRun the json operations against a data dictionary. Return True/False. Can raise a
JsonOperationError if operations are invalid or keys don't existfromjson_operationsimportexecuteexecute(<operations>,<data_dictionary>)->boolget_json_schemaReturns theJSON Schemafor json operations. This is useful for validating operations
before running themfromjson_operationsimportget_json_schemaget_json_schema()->Dictget_keysReturns the keys inside json operations. This is useful for getting a list of keys necessary for the json operations
and validating that all keys are inside the data dictionaryfromjson_operationsimportget_keysget_keys(<operations>)->List[Dict]# [{"name": "key1", "type": "number", "index": 0}, ...]Operators== (Equal operator)Check whether one value equal to another.Syntax["==",<operator_or_literal>,<operator_or_literal>]Examplefromjson_operationsimportexecuteoperations=["==",["key","items"],30]data1={"items":30}data2={"items":31}execute(operations,data1)# -> Trueexecute(operations,data2)# -> False!= (Not equal operator)Check whether one value is not equal to another.Syntax["!=",<operator_or_literal>,<operator_or_literal>]Examplefromjson_operationsimportexecuteoperations=["!=",["key","items"],30]data1={"items":30}data2={"items":31}execute(operations,data1)# -> Falseexecute(operations,data2)# -> True> (Greater than operator)Check whether one value is greater than another.Syntax[">",<operator_or_literal>,<operator_or_literal>]Examplefromjson_operationsimportexecuteoperations=[">",["key","items"],30]data1={"items":31}data2={"items":29}execute(operations,data1)# -> Trueexecute(operations,data2)# -> False>= (Greater than or equal operator)Check whether one value is greater than or equal to another.Syntax[">=",<operator_or_literal>,<operator_or_literal>]Examplefromjson_operationsimportexecuteoperations=[">=",["key","items"],30]data1={"items":30}data2={"items":29}execute(operations,data1)# -> Trueexecute(operations,data2)# -> False< (Less than operator)Check whether one value is less than another.Syntax["<",<operator_or_literal>,<operator_or_literal>]Examplefromjson_operationsimportexecuteoperations=["<",["key","items"],30]data1={"items":31}data2={"items":29}execute(operations,data1)# -> Falseexecute(operations,data2)# -> True< (Less than or equal operator)Check whether one value is less or equal to than another.Syntax["<=",<operator_or_literal>,<operator_or_literal>]Examplefromjson_operationsimportexecuteoperations=["<=",["key","items"],30]data1={"items":31}data2={"items":30}execute(operations,data1)# -> Falseexecute(operations,data2)# -> Truein (In operator)Check whether one value is contained in another.Syntax["in",<operator_or_literal>,<operator_or_literal>]Examplefromjson_operationsimportexecuteoperations=["in","my_type",["key","types"]]data1={"types":["type1","type2"]}data2={"types":["my_type","type1"]}execute(operations,data1)# -> Falseexecute(operations,data2)# -> True!in (Not In operator)Check whether one value is NOT contained in another.Syntax["!in",<operator_or_literal>,<operator_or_literal>]Examplefromjson_operationsimportexecuteoperations=["!in","my_type",["key","types"]]data1={"types":["type1","type2"]}data2={"types":["my_type","type1"]}execute(operations,data1)# -> Trueexecute(operations,data2)# -> Falsebtw (Between operator)Check whether one value is between 2 other values. Equivalent tolow <= val <= highBoth low and high value are included.Syntax["btw",<value_operator_or_literal>,[<low_operator_or_literal>,<high_operator_or_literal>]]Examplefromjson_operationsimportexecuteoperations=["btw",["key","val"],[1,3]]data1={"val":2}data2={"val":4}execute(operations,data1)# -> Trueexecute(operations,data2)# -> False& (Intersection operator)Check whether 2 arrays have any members in commonSyntax["&",<value_operator_or_literal>,<value_operator_or_literal>]Examplefromjson_operationsimportexecuteoperations=["&",["key","val"],[1,2]]data1={"val":[2,3]}data2={"val":[3,4]}execute(operations,data1)# -> Trueexecute(operations,data2)# -> False!& (Not Intersection operator)Check whether 2 arrays have no members in commonSyntax["!&",<value_operator_or_literal>,<value_operator_or_literal>]Examplefromjson_operationsimportexecuteoperations=["!&",["key","val"],[1,2]]data1={"val":[2,3]}data2={"val":[3,4]}execute(operations,data1)# -> Falseexecute(operations,data2)# -> Trueand (And operator)Check whether all values are True.andsupports nesting other operation inside
it (See complex example).Syntax["and",...<operators_or_literals>]Examplesfromjson_operationsimportexecuteoperations=["and",["key","a"],["key","b"]]data1={"a":True,"b":False,}data2={"a":True,"b":True,}execute(operations,data1)# -> Falseexecute(operations,data2)# -> Trueor (Or operator)Check whether any values are True.orsupports nesting other operation inside
it (See complex example).Syntax["or",...<operators_or_literals>]Examplesfromjson_operationsimportexecuteoperations=["or",["key","a"],["key","b"]]data1={"a":False,"b":False,}data2={"a":False,"b":True,}execute(operations,data1)# -> Falseexecute(operations,data2)# -> TrueComplex Operator Examplefromjson_operationsimportexecute# (a > 1 or b < 5) and (c == 0 or d != 10) and (val in e or f >= 0)operations=["and",["or",[">",["key","a"],1],["<",["key","b"],5]],["or",["==",["key","c"],0],["!=",["key","d"],10]],["or",["in","val",["key","e"]],[">=",["key","f"],0]],]data1={"a":0,"b":5,"c":0,"d":9,"e":["val","another_val"],"f":0,}data2={"a":0,"b":4,"c":0,"d":9,"e":["val","another_val"],"f":-1,}# (0 > 1 or 5 < 5) and (0 == 0 or 9 != 10) and (val in ["val", "another_val"] or 0 >= 0)execute(operations,data1)# -> False# (0 > 1 or 4 < 5) and (0 == 0 or 9 != 10) and (val in ["val", "another_val"] or -1 >= 0)execute(operations,data2)# -> TrueDifferences from json-logichttps://jsonlogic.com/Operations are always type safe (cannot compare different types). json-logic will automatically convert different types and compare them, which can lead to issues that are tough to findInvalid operations are errors instead of ignored. json-logic tries to avoid all errors and instead continues with unexpected input. This can lead to issuesMore compact and intuitive syntax:["or",["key","a"],["key","b"]]vs{"or":[{"var":["a"]},{"var":["b"]}]}Only supports boolean logic. json-logic supports all types of operations (addition, subtraction, etc.), not just boolean logic