我任意嵌套了json。我想获得一些值,这些值是几个键的深度,并且不能保证任何键都存在。
因此,例如,我可能想获取VoidTaskResult
,但是如果value = json_dict['a'][1]['q']['e']
,a
或q
不存在,在任何时候我都会遇到KeyError ,或者如果e
少于两个项目,则出现索引越界错误。如果满足这些条件中的任何一个,我希望将json_dict['a']
用作默认值,是否有某种方法可以执行此操作,而无需嵌套一堆if语句或value
调用,便是一行还是两行?
答案 0 :(得分:3)
您可以将以下简单的纯python版本放在一起:
def get_path(data, path, default=None):
try:
for item in path:
data = data[item]
return data
except (KeyError, TypeError, IndexError):
return default
nice_data = {'a': [None, {'q': {'e': 'Hello!'}}]}
bad_data = {'a': 6}
path = ['a', 1, 'q', 'e']
print('Good', get_path(nice_data, path)) # Hello!
print('Bad', get_path(bad_data, path)) # None
不是超级幻想,但它可以工作。
如果您想在一行中少做点事,而又拥有更多功能,我们可以使用诸如ObjectPath(https://pypi.org/project/objectpath/)之类的东西:
from objectpath import Tree
def get_object_path(data, path, default=None):
try:
return Tree(data).execute(path)
except (KeyError, TypeError, IndexError):
return default
path = '$.a[1].q.e'
print('Good', get_object_path(nice_data, path))
print('Bad', get_object_path(bad_data, path))
我们仍然必须进行自己的错误处理,并且速度会慢很多,但是它可以支持各种奇特的查询(来自docs):
In weather readings find cities where temperature is higher than 25°C and the sky is clear.
$..*[@..temp > 25 and @.clouds.all is 0].name