我有一组json与不同级别的数据,但类似的结构。我有一个文件,其中包含相关的值,格式类似于示例。
full_json = {"a": {"a1": 4, "a2": 5}, "b": 2, "c": 3}
relevant_keys = ["['a']['a1']", "['b']"]
我想创建json的副本,只有相关的键值对
expected_json = {"a": {"a1": 4}, "b": 2}
我如何以编程方式做到这一点,以便我可以继续在relevant_keys
中添加值,并在不同级别提取不同的数据?删除不是一个选项,因为json可能有新的字段,与我的用例无关。
我使用了字符串的动态求值:
- 通过
eval(f'full_json{k}')
获取full_json
的值 - 生成带有占位符的字符串模式,然后执行替换。我用旧的
%
(只是因为我很懒),但它可以用format
重新实现,但你应该逃避{,}
。此外,%
需要tuple
转换,否则只需要*
列表。
full_json = {"a": {"a1": 4, "a2": 5}, "b": 2, "c": 3}
relevant_keys = ["['a']['a1']", "['b']"]
expected_json = {}
for k in relevant_keys:
# clean string
k_ids = k[1:-1].replace('][', ' ').split() # slice rm the open&close bracket
# dictionary pattern with placeholder
k_ids_str = '{%s: ' * len(k_ids) + '%s' + '}' * len(k_ids)
# populate the string-like dictionary
k_dict_cmd = k_ids_str % tuple(k_ids + [eval(f'full_json{k}')])
# evaluate the pattern and update the needed dictionary
expected_json.update(**eval(k_dict_cmd))
print(expected_json)
输出{'a': {'a1': 4}, 'b': 2}