首页 > 解决方案 > 处理潜在丢失的 JSON 字段的最佳方法是什么?

问题描述

我有一个从外部 API 提取 JSON 数据的 python 脚本。我希望它打印每个 JSON 字典的名称、ID 号和所有者电子邮件地址。但并不是每个条目都有一个 ownerEmail,所以如果我尝试打印该字段,它会以KeyError: 'ownerEmail'. 我使用了 try-except 来解决这个问题:

for i in range (len(jsList)):
    try:
        print("Name: %s , ID: %s , Email: %s" % (jsList[i]['name'], jsList[i]['id'], jsList[i]['ownerEmail'] ))
    except:
        print("Name: %s , ID: %s " % (jsList[i]['name'], jsList[i]['id'] ))

这行得通,但老实说,我只是不喜欢它的外观。有没有办法重构代码,使其无需在另一行重复 2/3 的 print 语句即可工作?

标签: pythonjsonpython-3.xrefactoring

解决方案


最好的方法是使用该dict.get功能:

# Iterate over the items in the list directly
for entry in jsList:
    # f-strings or str.format are preferred over % formatting
    print(f"Name: {entry.get('name')}, ID: {entry.get('id')}, ...")

    # for str.format, you could do
    print("Name: {}, ID: {}, Email: {}".format(entry.get('name'), entry.get('id'), entry.get('useremail')))

这将允许您尝试获取密钥而不必捕获KeyError

a = {'name': 'John', 'lastname': 'Doe'}

print(a.get('name'))
John

print(a.get('id'))
None

print(a.get('id', 0))
0

第二个参数是如果缺少键,默认返回什么,如果它被排除,它将返回None


推荐阅读