在 Python 中提取 JSON 响应的核心字段,核心逻辑是 “先将 JSON 响应转为 Python 字典 / 列表 → 按字段路径逐层提取 → 处理字段缺失 / 异常”,适配所有 API 的 JSON 响应(包括沃尔玛、京东等平台接口)。以下是简单易懂、通用可复用的方法,附完整代码示例:
一、核心前提
JSON 响应本质是字符串,需先用 requests 库的 .json() 方法转为 Python 原生数据结构(字典dict或列表list),再按 “键名” 或 “索引” 提取字段。
二、3 种通用提取方法(从简单到复杂)
方法 1:直接键名提取(适合结构简单的 JSON)
如果 JSON 层级少、字段固定,直接用 dict["键名"] 或 dict.get("键名") 提取(推荐用 get 方法,字段缺失时返回默认值,避免报错)。
示例代码:
python
运行
import requests # 模拟API JSON响应(实际开发中替换为真实API请求) def mock_api_response(): return { "code": 200, "data": { "itemId": "WM123456", "title": "无线蓝牙耳机", "price": {"currentPrice": 79.99}, "inventory": {"stockStatus": "IN_STOCK"} } } # 1. 获取JSON响应并转为Python字典 json_data = mock_api_response() # 2. 直接提取核心字段(用get方法容错) code = json_data.get("code") # 提取顶层字段,缺失返回None item_id = json_data.get("data", {}).get("itemId", "未知ID") # 嵌套字段,逐层get current_price = json_data.get("data", {}).get("price", {}).get("currentPrice", 0.0) stock_status = json_data.get("data", {}).get("inventory", {}).get("stockStatus", "UNKNOWN") # 打印结果 print(f"响应状态:{code}") print(f"商品ID:{item_id}") print(f"当前售价:{current_price} USD") print(f"库存状态:{stock_status}")
关键说明:
dict.get("键名", 默认值):字段存在返回对应值,不存在返回默认值(如"未知ID"、0.0);- 嵌套字段需逐层用
get(如data→price→currentPrice),中间层级缺失时返回空字典{},避免抛出KeyError。
方法 2:循环提取(适合数组型 JSON,如评论列表、多规格商品)
如果 JSON 包含数组(如多条评论、多个 SKU),需先提取数组,再循环遍历每个元素提取字段。
示例代码(提取沃尔玛多规格商品):
python
运行
import requests # 模拟沃尔玛商品详情API JSON响应 def mock_walmart_response(): return { "code": 200, "data": { "itemId": "WM123456", "title": "无线蓝牙耳机", "variants": { "variant": [ # 数组:多个规格 {"variantId": "WM123-BLK", "color": "黑色", "price": {"currentPrice": 79.99}}, {"variantId": "WM123-WHT", "color": "白色", "price": {"currentPrice": 89.99}} ] } } } json_data = mock_walmart_response() # 提取多规格列表(数组) variants = json_data.get("data", {}).get("variants", {}).get("variant", []) # 循环提取每个规格的核心字段 print("商品规格详情:") for idx, spec in enumerate(variants, 1): spec_id = spec.get("variantId", f"规格{idx}") color = spec.get("color", "未知颜色") price = spec.get("price", {}).get("currentPrice", 0.0) print(f"- 第{idx}个规格:ID={spec_id},颜色={color},售价={price} USD")
关键说明:
- 数组字段提取时,默认值设为空列表
[](如get("variant", [])),避免循环时报错; - 用
enumerate生成索引,让输出更清晰。
方法 3:封装工具函数(通用复用,适合复杂 JSON)
如果需要频繁提取不同 API 的 JSON 字段,可封装通用函数,按 “字段路径” 批量提取,减少重复代码。
示例代码:
python
运行
import requests def extract_json_fields(json_data, field_paths, default_values=None): """ 通用JSON字段提取函数 :param json_data: 转为Python字典的JSON数据 :param field_paths: 字段路径列表(如 ["data.itemId", "data.price.currentPrice"]) :param default_values: 对应字段的默认值列表(与field_paths顺序一致) :return: 提取后的字段值列表 """ if default_values is None: default_values = [None] * len(field_paths) results = [] for field_path, default in zip(field_paths, default_values): keys = field_path.split(".") # 按"."拆分字段路径(如 "data.price.currentPrice" → ["data", "price", "currentPrice"]) value = json_data for key in keys: # 若当前值是字典,按键名提取;若是列表,取第一个元素(可根据需求修改) if isinstance(value, dict): value = value.get(key, default) elif isinstance(value, list) and value: value = value[0].get(key, default) # 处理列表首个元素的字段 else: value = default break # 中间层级异常,直接返回默认值 results.append(value) return results # 模拟API JSON响应 def mock_api_response(): return { "code": 200, "data": { "itemId": "WM123456", "title": "无线蓝牙耳机", "price": {"currentPrice": 79.99}, "inventory": {"stockStatus": "IN_STOCK"}, "variants": {"variant": [{"color": "黑色"}, {"color": "白色"}]} } } # 调用函数批量提取字段 json_data = mock_api_response() # 定义要提取的字段路径和默认值 field_paths = [ "code", # 顶层字段 "data.itemId", # 嵌套字段 "data.price.currentPrice", # 三层嵌套 "data.inventory.stockStatus", "data.variants.variant.color" # 数组字段 ] default_values = [0, "未知ID", 0.0, "UNKNOWN", "未知颜色"] # 批量提取 results = extract_json_fields(json_data, field_paths, default_values) # 输出结果 field_names = ["响应状态", "商品ID", "当前售价", "库存状态", "首个规格颜色"] for name, value in zip(field_names, results): print(f"{name}:{value}")
关键说明:
- 字段路径用字符串表示(如
data.price.currentPrice),函数自动拆分层级; - 支持数组字段(默认取第一个元素),可根据需求修改函数逻辑(如提取所有数组元素);
- 一次可提取多个字段,适合复杂 JSON 的批量解析。
三、常见问题与避坑指南
- 字段缺失报错:永远用
dict.get("键名", 默认值)代替dict["键名"],避免因字段缺失抛出KeyError; - 嵌套层级过深:中间层级可能为
None(如data为None),需在每层都用get并设置默认空字典{}(如json_data.get("data", {}).get("price", {})); - 数组字段处理:数组可能为空(如
comments: []),提取时默认值设为空列表[],循环前先判断数组长度; - 类型不匹配:提取后需根据业务需求转换类型(如价格字段转为
float、库存数量转为int),示例:python
运行
current_price = float(json_data.get("data", {}).get("price", {}).get("currentPrice", 0.0))
四、总结
Python 提取 JSON 核心字段的核心是 “逐层提取 + 容错处理”,推荐优先使用:
- 简单 JSON:直接用
get方法逐层提取; - 数组型 JSON:循环遍历 +
get方法; - 频繁解析:封装通用函数,按字段路径批量提取。
以上方法通用所有 API 的 JSON 响应,替换真实 API 请求后即可直接使用,兼顾简洁性和健壮性。