如何使用两个键读取 JSON

How to read from a JSON with two keys

我有一个 json 需要导入,然后 return 某个值。 json 有两个键,比如

{
"NUM_High_Objects": {
 "abseta_pt": {
            "field1:[0.0,0.9]": {
                "field2:[15,20]": {
                   
                    "tagIso": 0.00012,
                    "value": 0.99
                },
                 "field2:[20,25]": {
                   
                    "tagIso": 0.00035,
                    "value": 0.98
                }
            },
            "field1:[0.91,1.2]": {
                "field2:[15,20]": {
                   
                    "tagIso": 0.00013,
                    "value": 0.991
                },
                 "field2:[20,25]": {
                   
                    "tagIso": 0.00036,
                    "value": 0.975
                     }
            },
            "binning": [
                {
                    "binning": [
                        0.0,
                        0.9,
                        1.2,
                        2.1,
                        2.4
                    ],
                    "variable": "abseta"
                },
                {
                    "binning": [
                        15,
                        20,
                        25,
                        30,
                        40,
                        50,
                        60,
                        120
                    ],
                    "variable": "pt"
                }
            ]
        }
    },

我需要的是搜索一对值是否在“field1”和“field2”的范围内以及return对应的“值”

我试过按照这个 但无法正常工作...

我试过


class checkJSON() :

    def __init__(self,filein) :
        self.good, self.bad  = 0, 0
        print 'inside json function : will use the JSON', filein
        input_file = open (filein)
        self.json_array = json.load(input_file)

    def checkJSON(self,LS,run) :
        try :
            LSlist = self.json_array[str(run)]
            for LSrange in LSlist :print LSrange, run
        except KeyError :
            pass

        self.bad += 1
        return False

CJ=''
CJ=checkJSON(filein='test.json')
isInJSON = CJ.checkJSON("0.5", "20")

print isInJSON

但这不起作用,因为我不确定如何在键内循环

如果我没有正确理解你的问题,那么你 JSON 的相关部分是:

{
    "field1:[0.0,0.9]": {
        "field2:[15,20]": {
            "tagIso": 0.00012,
            "value": 0.99
        },
        "field2:[20,25]": {
            "tagIso": 0.00035,
            "value": 0.98
        }
    },
    "field1:[0.91,1.2]": {
        "field2:[15,20]": {
            "tagIso": 0.00013,
            "value": 0.991
        },
        "field2:[20,25]": {
            "tagIso": 0.00036,
            "value": 0.975
        }
    },
    "binning": [
        {
            "binning": [
                0.0,
                0.9,
                1.2,
                2.1,
                2.4
            ],
            "variable": "abseta"
        },
        {
            "binning": [
                15,
                20,
                25,
                30,
                40,
                50,
                60,
                120
            ],
            "variable": "pt"
        }
    ]
}

那么下面的代码应该可以实现您想要实现的目标。看起来您不需要搜索嵌套键,您只需要解析 field1[...]field2[...]。下面的代码是我理解您要实现的目标的快速实现。如果第一个参数在 field1[...] 范围内,第二个参数在 field2[...] 范围内,它将 return 值。否则会returnNone.

import json

def check_json(jsondict, l1val, l2val):
    def parse_key(keystr):
        level, lrange = keystr.split(':')
        return level, eval(lrange)

    for l1key, l2dict in jsondict.items():
        if 'field' in l1key:
            l1, l1range = parse_key(l1key)
            if l1val >= l1range[0] and l1val <= l1range[1]:
                for l2key, vals in l2dict.items():
                    l2, l2range = parse_key(l2key)
                    if l2val >= l2range[0] and l2val <= l2range[1]:
                        return vals['value']
    return None

这是一个驱动程序代码,用于测试上面的实现。

if __name__ == '__main__':
    with open('data.json', 'r') as f:
        myjson = json.load(f)
    print(check_json(myjson, 0.5, 20))