Python脚本调用API遇KeyError:缺失JSON字段时如何跳过或显示无信息?
解决JSON字段缺失触发KeyError的问题
针对你脚本里API返回JSON字段时有时无导致报错的情况,这里提供两种解决方案,分别对应「显示‘no info’」和「跳过缺失内容」的需求:
方案一:缺失字段显示「no info」
这种方案下,不管字段是否存在,都会显示对应的标签,缺失时用「no info」填充内容:
data = {'name': 'Kev', 'connected': 'ONLINE', 'time': '2024-03-03T23:01:00Z', 'up-loader': [{'uploaded': 'Yes', 'upload-time': '2024-03-03T18:01:00Z'}]} # 必选字段直接获取(确保API一定会返回) InfoNAME = data["name"] InfoCONN = data["connected"] InfoTIME = data["time"] # 可选字段用get方法处理,避免KeyError,缺失时返回默认值'no info' # 先获取up-loader列表,不存在则返回空列表 up_loader_list = data.get('up-loader', []) # 列表不为空则取第一个元素,否则用空字典 up_loader_item = up_loader_list[0] if up_loader_list else {} # 从字典中取值,缺失时返回'no info' InfoUPLOAD = up_loader_item.get('uploaded', 'no info') InfoUPTIME = up_loader_item.get('upload-time', 'no info') # 更新文本框内容 text_box.delete('1.0', END) # 插入必选信息(加换行让内容更清晰) text_box.insert(END, "Name: ") text_box.insert(END, InfoNAME + "\n") text_box.insert(END, "Status: ") text_box.insert(END, InfoCONN + "\n") text_box.insert(END, "Last Online: ") text_box.insert(END, InfoTIME + "\n") # 插入上传相关信息(缺失时显示no info) text_box.insert(END, "Was there an upload: ") text_box.insert(END, InfoUPLOAD + "\n") text_box.insert(END, "When was the upload: ") text_box.insert(END, InfoUPTIME + "\n")
关键修改点:
- 用
data.get('up-loader', [])替代直接data['up-loader'],字段缺失时返回空列表,避免KeyError - 先判断列表是否为空,再取第一个元素,防止空列表索引报错
- 用
up_loader_item.get('字段名', 'no info')获取嵌套字段,缺失时返回指定默认值
方案二:缺失字段直接跳过显示
如果希望完全不显示缺失字段的相关行,可以加条件判断:
data = {'name': 'Kev', 'connected': 'ONLINE', 'time': '2024-03-03T23:01:00Z', 'up-loader': [{'uploaded': 'Yes', 'upload-time': '2024-03-03T18:01:00Z'}]} # 必选字段获取 InfoNAME = data["name"] InfoCONN = data["connected"] InfoTIME = data["time"] # 初始化上传相关变量为None InfoUPLOAD = None InfoUPTIME = None # 检查up-loader字段是否存在且不为空 if 'up-loader' in data and len(data['up-loader']) > 0: up_loader_item = data['up-loader'][0] # 检查子字段是否存在 if 'uploaded' in up_loader_item: InfoUPLOAD = up_loader_item['uploaded'] if 'upload-time' in up_loader_item: InfoUPTIME = up_loader_item['upload-time'] # 更新文本框内容 text_box.delete('1.0', END) # 插入必选信息(加换行让内容更清晰) text_box.insert(END, "Name: ") text_box.insert(END, InfoNAME + "\n") text_box.insert(END, "Status: ") text_box.insert(END, InfoCONN + "\n") text_box.insert(END, "Last Online: ") text_box.insert(END, InfoTIME + "\n") # 仅当字段存在时插入对应内容 if InfoUPLOAD is not None: text_box.insert(END, "Was there an upload: ") text_box.insert(END, InfoUPLOAD + "\n") if InfoUPTIME is not None: text_box.insert(END, "When was the upload: ") text_box.insert(END, InfoUPTIME + "\n")
关键修改点:
- 用
'字段名' in 字典判断字段是否存在,避免直接索引报错 - 对嵌套的列表和字段逐层检查,确保每一步都安全
- 通过变量是否为None来决定是否插入对应的文本行
内容的提问来源于stack exchange,提问作者CantCode2SaveHerself
相关产品推荐
相关产品推荐

