Python requests处理JSON接口返回:字典取值与解析示例
讲解用requests调用JSON API并用resp.json()把响应转成Python字典,逐层取字段、处理嵌套数据,适合对接天气、汇率、内部接口。
场景痛点
现在大多数后台接口返回的都是JSON,不是HTML网页。浏览器里看到的是一串花括号,手动复制出来粘到Excel里还得清洗。用requests拿到响应后调用 .json() 方法,直接变成Python字典,想要哪个字段就按key取,比解析HTML简单十倍。
用到的库
pip install requests beautifulsoup4 lxml
完整代码
# 导入requests
import requests
def call_json_api(city="北京"):
"""调用一个公开的JSON接口并解析"""
# 用一个公开的JSON占位接口做演示
url = "https://httpbin.org/json"
resp = requests.get(url, timeout=10)
# 检查状态码
if resp.status_code != 200:
print("接口请求失败:", resp.status_code)
return None
# 关键一步:把响应体解析成Python字典/列表
data = resp.json()
# 打印整个结构看看
print("返回类型:", type(data))
print("顶层键:", list(data.keys()))
# 示例:假设返回里有一个slideshow字段,逐层往下取
if "slideshow" in data:
title = data["slideshow"].get("title", "无标题")
slides = data["slideshow"].get("slides", [])
print("幻灯片标题:", title)
print("幻灯片数量:", len(slides))
# 遍历列表
for i, slide in enumerate(slides, 1):
print(f"第{i}页:{slide.get('title')}(类型:{slide.get('type')})")
return data
def safe_get_nested(data, *keys, default=None):
"""安全地从嵌套字典里取值,任一层不存在就返回默认值"""
cur = data
for k in keys:
if isinstance(cur, dict) and k in cur:
cur = cur[k]
else:
return default
return cur
def main():
data = call_json_api()
# 演示安全取深层字段
if data:
value = safe_get_nested(data, "slideshow", "author", default="未知")
print("作者:", value)
if __name__ == "__main__":
main()
代码讲解
resp.json()是requests内置方法,它会自动把响应体按UTF-8解析成Python对象(字典或列表),等价于json.loads(resp.text)。- 解析后就是普通的字典和列表,用
data["key"]或data.get("key", 默认值)取值,和操作本地数据没区别。 - 嵌套结构用链式取值:
data["a"]["b"]["c"],但中间任何一层缺key都会抛KeyError,所以写了个safe_get_nested工具函数做安全取值。 - 调试时先
print(data)看完整结构,再决定怎么取,不要凭想象写key。 - 接口报错时也可能返回JSON(带错误码),所以先判断
status_code再.json()。
运行结果
运行后会打印返回类型(dict)、顶层键、幻灯片标题和每页标题,最后打印作者字段。如果某一层字段缺失,安全取值函数会返回默认值而不是崩溃。
注意事项
- 接口返回的JSON可能是数组开头(
[...]),这时resp.json()得到的是列表,用data[0]取第一项。 - 某些中文接口用GBK编码,
.json()可能乱码,先设置resp.encoding='utf-8'再解析。 - 高频调用第三方免费接口可能被限流,注意缓存结果,不要重复请求。
- 企业内部接口通常需要token或签名,放在Headers里传。

更新时间:2026-09-14 20:48:32
上一篇:Python requests爬取分页数据:循环翻页与停止条件