Representing logic as data in JSON

前端 未结 12 1472
眼角桃花
眼角桃花 2021-01-29 21:37

For business reasons we need to externalize some conditional logic into external files: preferably JSON.

A simple filter-by scenario could be handled by adding a node a

12条回答
  •  夕颜
    夕颜 (楼主)
    2021-01-29 22:07

    The first came to mind would be the recurisve

    dict1={'$lte':'<','$nin':'not in '}
    
    def updateOp(subdictItem):
    
        for ites in subdictItem:
            ops = ites
            print dict1.get(ops), subdictItem.get(ops), type(subdictItem.get(ops))
            if type(subdictItem.get(ops)) is list:
                valuelist=subdictItem.get(ops)
                strlist=' ,'.join([str(x) for x in valuelist])
                sub = dict1.get(ops) + "(" +strlist +")"
            else:
                sub = dict1.get(ops) +' ' + str(subdictItem.get(ops))
        return sub
    
    def jsonString(input_dict):
        items=''
        itemslist=[]
        list = []
        for item in input_dict:
            op=item
            itemssublist=[]
    
            # print "item",op
            for subitem in input_dict.get(op):
                # print("subitem",subitem)
                for ite in subitem:
                    if ite not in ('and','or'):
                        # print('ite_raw',ite,subitem.get(ite))
                        sub=''
                        if type(subitem.get(ite)) is dict:
                            sub=updateOp(subitem.get(ite))
                        else:
                            sub='=' + str(subitem.get(ite))
                        itemssublist.append(ite+sub)
                    else:
                        item1=jsonString(subitem)
                        itemssublist.append(item1)
    
            delimiter=" "+op+ " "
            items= "("+delimiter.join(itemssublist)+")"
        return items 
    
    
    
    
    
    if __name__ == "__main__":
    
        input_dict={}
        with open('ops.json','r') as f:
            input_dict=json.load(f)
    
        print input_dict
    
        test= jsonString(input_dict)
    
    #result : (age< 3 or name=Joe or (age=5 and age not in (1 ,2 ,3)))
    ops.json file:
    {
       "or":[
          {
             "age":{
                "$lte":3
             }
          },
          {
             "name":"Joe"
          },
          {
             "and":[
                {
                   "age":5
                },
                {
                   "age ":{
                      "$nin":[
                         1,
                         2,
                         3
                      ]
                   }
                }
             ]
          }
       ]
    }
    

提交回复
热议问题