解析JSON提取meta.total字段时出现ERROR - 'meta'报错排查
报错原因
你看到的ERROR - 'meta'是日志封装后输出的Python KeyError,触发点在tt = totals['meta']['total']这行的totals['meta']取值环节——代表totals(也就是接口响应解析后得到的字典)的顶级键里根本不存在meta字段,核心问题是你预设的JSON返回结构和接口实际返回的结构不一致,常见触发场景:
- 接口请求未成功:比如权限校验失败、传参错误、服务端异常时,接口会返回仅包含错误码、错误描述的JSON,不会返回
droplets、meta这类正常业务字段 - 返回结构存在外层嵌套:比如真实返回结构是
{"code": 0, "data": {"droplets": [], "meta": {"total": 3}}}这类带通用外层包装的格式,你直接在最外层查找meta自然匹配不到 - 注意:如果是JSON本身格式错误(比如你粘贴的示例末尾缺失闭合
}的问题),.json()方法会直接抛出JSON解析异常,不会触发当前的KeyError,这部分是你贴示例时的笔误,不是本次报错的诱因
修复方案
- 第一步先打印真实响应内容,不要靠预设结构写代码,先执行以下代码确认实际返回:
print("请求状态码:", droplet_response.status_code) print("响应原始内容:", droplet_response.text) totals = droplet_response.json() print("解析后字典的所有顶级键:", list(totals.keys()))
- 确认真实结构后,按以下逻辑优化代码,增加异常判断,避免直接取值触发崩溃:
# 先校验HTTP请求是否成功 if droplet_response.status_code != 200: print(f"接口请求失败,状态码:{droplet_response.status_code},返回:{droplet_response.text}") # 此处补充错误处理逻辑,比如重试、抛出业务异常 else: resp_data = droplet_response.json() # 按真实嵌套层级取值,比如如果meta在外层data下,就改为resp_data.get('data', {}).get('meta', {}).get('total') meta_info = resp_data.get('meta', {}) total = meta_info.get('total') if total is not None: tt = total print(f"成功获取total值:{tt}") else: print(f"未找到meta.total字段,当前响应顶级键为:{list(resp_data.keys())}")
用dict.get()方法取值比直接用[]取值更稳妥,键不存在时会返回你设置的默认值(这里设置为空字典/None),不会直接抛出KeyError中断程序。
内容的提问来源于stack exchange,提问作者Horus
相关产品推荐
相关产品推荐

