使用python中的默认值从json深度获取项目

时间:2018-09-21 15:57:30

标签: python

我任意嵌套了json。我想获得一些值,这些值是几个键的深度,并且不能保证任何键都存在。

因此,例如,我可能想获取VoidTaskResult,但是如果value = json_dict['a'][1]['q']['e']aq不存在,在任何时候我都会遇到KeyError ,或者如果e少于两个项目,则出现索引越界错误。如果满足这些条件中的任何一个,我希望将json_dict['a']用作默认值,是否有某种方法可以执行此操作,而无需嵌套一堆if语句或value调用,便是一行还是两行?

1 个答案:

答案 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