Python解析JSON取值时触发KeyError 'response'报错如何解决
KeyError: 'response' 排查与解决方法
首先明确:不存在「新版本JSON索引取值规则变更」的可能,Python字典取值逻辑、标准库JSON解析规则是长期稳定的,该异常100%是你实际拿到的json_here_response对象结构和你写的链式取值路径不匹配导致的。
定位步骤
- 第一步先确认顶层结构:执行
print(list(json_here_response.keys()))打印当前返回对象的所有顶层键,首先确认是否存在response键。
绝大多数场景下缺失response是因为接口返回了错误结构:比如鉴权失败、参数非法、配额耗尽、服务端内部错误时,返回的结构通常是{"error": "xxx", "error_description": "xxx"}格式,根本不包含业务返回的response字段。 - 第二步逐层校验嵌套结构:就算
response字段存在,你写的长链式取值['response']['route'][0]['leg'][0]['link'][0]['functionalClass']里任意一层缺键、或者数组为空,都会触发报错(数组为空时取[0]会触发IndexError),不要默认所有层级的字段、数组都一定存在。
修复方案
- 先处理接口异常分支:在解析业务字段前,先判断返回结构是否符合预期
if 'response' not in json_here_response: # 打印完整返回内容排查接口错误,比如看返回的error字段信息 print("接口返回异常结构:", json_here_response) # 这里可以加错误处理逻辑,比如抛出明确异常、重试请求等 return - 替换硬编码链式取值为安全逐层取值,避免单节点结构异常直接中断程序:
# 每层都设置空默认值,缺失时不会抛KeyError response_data = json_here_response.get('response', {}) route_list = response_data.get('route', []) functional_class = None if route_list: first_route = route_list[0] leg_list = first_route.get('leg', []) if leg_list: first_leg = leg_list[0] link_list = first_leg.get('link', []) if link_list: first_link = link_list[0] functional_class = first_link.get('functionalClass') if functional_class is not None: street_info.append(functional_class) - 如果确认是API版本升级导致返回结构变化,对照你打印出来的实际JSON结构,调整字段取值的路径即可。
调试阶段一定要打印完整的原始返回内容,不要靠猜接口返回结构,服务端返回的错误信息通常会直接写明问题原因,能省很多排查时间。
内容的提问来源于stack exchange,提问作者th2000
相关产品推荐
相关产品推荐

