python - 处理潜在丢失的 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 语句即可工作?
解决方案
最好的方法是使用该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
推荐阅读
- java - 使用java本机接口获取windows当前用户
- azure - 在 Service Fabric 中,可靠队列是否仅适用于相同的服务类型?
- c - 从没有“零”保存的稀疏矩阵中打印矩阵线
- social-tables - 现在是否允许在第三方应用程序上授予刷新令牌?
- git - Git:处理重命名大量文件的最佳方法
- php - PHP插入没有主键的json对象
- c# - 如果直到运行时才知道对象的名称,如何引用对象的属性?
- c# - 如何将列表字符串传递给 TempData Asp.Net
- javascript - 计算 typeof 值为 'object' 的属性在另一个对象中的数量
- angular - Angular 为什么我们需要 markForCheck 当 detectChanges 也有效时