如何执行nvl()以避免来自不存在的json元素的错误?

2024-04-25 19:29:14 发布

您现在位置:Python中文网/ 问答频道 /正文

一句话,我要找的或多或少是Python中SQL的nvl()的等价物。在

更多信息:

我有一个从json列表中检索数据的循环。它们看起来都一样,但有些却缺少我要找的东西。因此,如果我试图获取data['movie']['boxOffice'][0]['admissionCount'],但它不在JSON中,我会得到一个错误(注意:这可能是因为'admissionCount'不存在,或者'boxOffice'不存在)。在

为了避开这个问题,我现在要做的是:

try:
    admissionCount = data['movie']['boxOffice'][0]['admissionCount']
except:
    admissionCount = ''

它工作得很好,但我有大约50个字段需要检查。。。在

我试着把它变成一个函数:

^{pr2}$

然后意识到这是愚蠢的,当然我得到了一个错误。在

我怎样才能避免做50个try/except块?在

谢谢


Tags: 数据信息json列表sqldata错误movie
3条回答

您可以对dict使用带默认值的.get()方法

dict = {"a" : 1}
dict.get("a") # return 1
dict.get("b") # return None
dict.get("b", "default_obj") # return default_obj

您可以使用函数安全地深入到该结构中:

def get_deep_dict(a_dict, keys):
    value = a_dict
    for key in keys:
        try:
            value = value.get(key)
        except AttributeError:
            try:
                value = value[key]
            except (IndexError, TypeError):
                return None
    return value

测试数据和测试用例:

^{pr2}$

在这方面,我们不妨用一种普通的方式来做:

def get_default(base, *keys, **kwargs):
    sentinel = kwargs.get('sentinel', None)
    cur = base
    for key in keys:
        try:
            cur = cur[key]
        except (KeyError, IndexError):
            return sentinel
    return cur

data = {
    'movie': {
        'boxOffice': [
            {'admissionCount': 10},
            {'admissionCount': 20},
        ]
    }
}

这要求任何子对象实现正确的__getitem__(),该子对象不会引发KeyError或{}来处理不可访问(子)项以外的任何其他项。从默认JSON解码器返回的dict和list对象会执行此操作,但要小心自定义对象。在

^{pr2}$

相关问题 更多 >