如何在循环解析JSON时实现错误检查?处理TVmaze API返回的None对象
处理TVmaze API JSON中的None对象,避免循环中断
嘿,我完全懂你碰到的糟心事——遍历TVmaze返回的JSON数据时,某个image字段突然变成了None,直接用'medium' not in images判断会触发TypeError,导致整个循环卡壳,对吧?其实问题出在你没先判断images本身是不是None,直接对None做字典操作肯定会报错。下面给你几种靠谱的解决办法:
方法1:先检查None,再判断键是否存在
这是最直观的方式,先确认images不是None,再去检查里面的键:
# 假设tvmaze_data是你从API拿到的JSON列表 for show in tvmaze_data: images = show.get('image') # 用get避免show里没有'image'键的情况 # 先判断images是否为None,再检查是否缺少'medium'键 if images is None or 'medium' not in images: print("跳过该对象:image为None或缺少medium字段") continue # 走到这里说明images是有效的字典,且存在medium字段 medium_img_url = images['medium'] # 接下来处理你的业务逻辑,比如存储URL print(f"获取到中等尺寸图片:{medium_img_url}")
方法2:用try-except捕获异常
如果不想写太多判断,也可以直接用异常捕获来处理,把可能出错的代码包在try块里:
for show in tvmaze_data: try: images = show['image'] # 这里如果show没有'image'键会触发KeyError,也可以换成show.get('image') medium_img_url = images['medium'] # 正常处理逻辑 print(f"获取到中等尺寸图片:{medium_img_url}") except (TypeError, KeyError): # TypeError:当images是None时,访问images['medium']会触发 # KeyError:当images是字典但没有'medium'键时触发 print("跳过该对象:image无效或缺少medium字段") continue
方法3:链式get调用(更简洁)
利用字典的get()方法可以返回默认值的特性,链式调用直接获取结果,避免嵌套判断:
for show in tvmaze_data: # 如果show没有'image'键,或者image是None,或者image没有'medium'键,都会返回None medium_img_url = show.get('image', {}).get('medium') if medium_img_url is None: print("跳过该对象:无法获取medium图片") continue # 处理逻辑 print(f"获取到中等尺寸图片:{medium_img_url}")
这里show.get('image', {})的意思是:如果show里没有'image'键,就返回一个空字典,这样后面的.get('medium')就不会因为None报错了——空字典调用get会返回None,刚好符合我们的判断条件。
为什么你之前的写法会报错?
当images是None时,'medium' not in images相当于在一个None对象上执行in操作,而None既不是字典也不是可迭代对象,Python会直接抛出TypeError: argument of type 'NoneType' is not iterable,所以必须先判断images是否为None,再进行后续的字典操作。
内容的提问来源于stack exchange,提问作者TonyH
相关产品推荐
相关产品推荐

