从JSON键在本地作用域中创建命名变量

时间:2016-03-17 20:00:15

标签: python json function

有没有办法可以从json文件在本地范围内创建命名变量?

document json

这是我的json文件,我想在本地范围内创建变量,命名为我的json字典的路径

这是我手动创建它们的方式,我想自动为所有json文件执行此操作。有可能吗?

class board(object):
    def __init__(self, json, image):
        self.json = json
        self.image = image  

    def extract_json(self, *args):
        with open(self.json) as data_file:
            data = json.load(data_file)
            jsonpath_expr = parse(".".join(args))
            return jsonpath_expr.find(data)[0].value    

MyAgonism = board('document.json', './tabellone.jpg')

boxes_time_minutes_coord = MyAgonism.extract_json("boxes", "time_minutes", "coord")
boxes_time_seconds_coord = MyAgonism.extract_json("boxes", "time_seconds", "coord")
boxes_score_home_coord = MyAgonism.extract_json("boxes", "score_home", "coord")

1 个答案:

答案 0 :(得分:1)

我认为你让它变得比它需要的复杂得多。

with open('document.json') as f:
    d = json.load(f)

time_minutes_coords = d['boxes']['time_minutes']['coord']
time_seconds_coords = d['boxes']['time_seconds']['coord']
score_home_coords = d['boxes']['score_home']['coord']

如果你真的想从json文件中的键创建本地范围内的命名变量,你可以使用locals()字典(但这是一个糟糕的主意,它只是对从json字典中引用它们。

# Flatten the dictionary keys.
# This turns ['boxes']['time_minutes']['coord'] 
# into "boxes_time_minutes_coord"
def flatten_dict(d, k_pre=None, delim='_', fd=None):
    if fd is None:
        fd = {}
    for k, v in d.iteritems():
        if k_pre is not None:
            k = '{0}{1}{2}'.format(k_pre, delim, k)
        if isinstance(v, dict):
            flatten_dict(v, k, delim, fd)
        else:
            fd[k] = v
    return fd

fd = flatten_dict(d)
locals().update(fd)

print boxes_time_minutes_coord

很多注意事项,比如在本地范围内覆盖其他变量的可能性,或者在展平后两个字典键可能相同的可能性,除非您选择不会出现在任何字典键中的分隔符。或者,如果您的密钥包含变量名称的无效字符(例如空格),这将无法工作。