当元素不存在时,正确处理JSON Parsing TypeError的方法

时间:2017-03-18 16:10:58

标签: python json parsing dataframe

代码最终得到了我想要的东西。 (这是从一个非常大的json数据集创建我想要的字段的字典列表,这样我就可以为其他数据处理创建一个数据帧)

但是我必须构建一个非常大的try / expect块来完成这项工作。我想知道是否有更清晰/聪明的方法来做到这一点。

我遇到的问题是细节['元素' ]有时不存在或有值,如果出现NonType异常,则会抛出它不存在于子元素['值' ]中,因为它不存在而无法获取。

所以我有一个非常大的try / except块将变量设置为'' 如果发生这种情况。

我尝试将详细信息[&#​​39; element']发送给一个可以向变量输出返回值的函数......但看起来我不能这样做,因为Python检查如果元素在传递给函数之前是 NoneType ,则会在将其发送到函数之前发生。

有什么想法吗?

rawJson = json.loads(data.decode('utf-8'))
issues = rawJson['issues']
print('Parsing data...')
for ticket in issues:
    details = ticket['fields']

    try:
        key = ticket['key']
    except TypeError:
        key = ''
    try:
        issueType = details['issuetype']['name']
    except TypeError:
        issueType = ''
    try:
        description = details['description']
    except TypeError:
        description = ''
    try:
        status = details['status']['name']
    except TypeError:
        status = ''
    try:
        creator = details['creator']['displayName']
    except TypeError:
        creator =''
    try:
        assignee = details['assignee']['displayName']
    except TypeError:
        assignee =''
    try:
        lob = details['customfield_10060']['value']
    except TypeError:
        lob ='' 

 .... There is a long list of this

1 个答案:

答案 0 :(得分:1)

您可以使用get method来提供默认值以简化此代码:

d = {'a': 1, 'c': 2}
value = d.get('a', 0) // value = 1 here because d['a'] exists
value = d.get('b', 0) // value = 0 here because d['b'] does not exist

所以你可以写:

for ticket in issues:
    details = ticket['fields']

    key = ticket.get('key', '')
    description = details.get('description', '')
    issueType = details['issuetype'].get('name') if 'issuetype' in details else ''

    ...