在电商数据分析、价格监控、竞品研究等场景中,调用京东 API 获取商品数据是常见需求。京东商品 API 返回的响应数据结构复杂,包含多层嵌套 JSON 和 SKU(库存保有单位)相关的多维数据。本文将深入解析京东商品 API 响应的核心结构,重点讨论嵌套 JSON 的处理方法和 SKU 数据模型的构建,并提供 Python 实战代码示例。
一、京东商品 API 响应结构概述
京东商品 API返回的响应数据以 JSON 格式呈现,整体结构可分为三层:
- 顶层响应头:包含状态码、错误信息、请求 ID 等元数据;
- 中间层商品主体:包含商品基本信息(名称、价格、品牌等)、规格参数、营销信息等;
- 底层 SKU 细节:包含该商品下所有 SKU 的具体信息(如颜色、尺寸、库存、价格等),以及 SKU 之间的关联关系。
典型响应结构示例(简化版)
{
"code": 0,
"message": "success",
"requestId": "abc123",
"data": {
"product": {
"productId": 123456,
"productName": "京东京造无线蓝牙耳机",
"brandName": "京东京造",
"price": 199.00,
"marketPrice": 299.00,
"specification": {
"specs": [
{
"specName": "颜色",
"specValues": ["白色", "黑色", "蓝色"]
},
{
"specName": "版本",
"specValues": ["标准版", "Pro版"]
}
]
},
"skus": [
{
"skuId": 12345678,
"skuName": "京东京造无线蓝牙耳机 白色 标准版",
"price": 199.00,
"stock": 1000,
"specInfo": {
"颜色": "白色",
"版本": "标准版"
},
"imageUrl": "https://img10.360buyimg.com/n1/jfs/t1/xxx/xxx.jpg"
},
{
"skuId": 12345679,
"skuName": "京东京造无线蓝牙耳机 黑色 Pro版",
"price": 249.00,
"stock": 500,
"specInfo": {
"颜色": "黑色",
"版本": "Pro版"
},
"imageUrl": "https://img10.360buyimg.com/n1/jfs/t1/yyy/yyy.jpg"
}
]
}
}
}
二、核心挑战:嵌套 JSON 处理与 SKU 数据建模
1. 嵌套 JSON 的层级复杂性
京东商品 API 响应包含多层嵌套(如data -> product -> specification -> specs、data -> product -> skus -> specInfo),直接解析容易出现 “键不存在” 的异常,且代码可读性差。
2. SKU 数据的多维关联
一个商品通常对应多个 SKU(由规格组合生成,如 “颜色 + 版本”),需要建立 SKU 与规格参数的映射关系,同时处理 SKU 价格、库存等动态数据。
3. 数据清洗与标准化
API 返回的部分字段(如价格、库存)可能存在格式不统一、缺失等问题,需要进行清洗和标准化处理。
三、解决方案:分层解析与结构化建模
1. 嵌套 JSON 解析:使用递归与异常处理
通过递归函数遍历 JSON 嵌套结构,结合异常处理机制(如try-except、get方法),安全提取目标字段。
2. SKU 数据建模:构建规格 - SKU 映射表
将 SKU 的规格信息(如颜色、版本)提取为键值对,构建 “规格组合 - SKU” 映射表,便于快速查询特定规格对应的 SKU 数据。
3. 数据清洗:标准化字段格式
对价格、库存等字段进行类型转换和范围校验,确保数据的一致性和可用性。
四、Python 实战代码示例
1. 环境准备
安装必要的库:
pip install requests jsonpath-ng
2. API 请求与响应解析
import requests
import json
from jsonpath_ng import parse
# 京东API配置(需替换为实际的AppKey和AppSecret)
APP_KEY = "your_app_key"
APP_SECRET = "your_app_secret"
API_URL = "https://api.jd.com/routerjson"
def get_jd_product_detail(product_id):
"""调用京东商品详情API,获取响应数据"""
params = {
"method": "jingdong.product.read.findProductDetailById",
"app_key": APP_KEY,
"timestamp": "", # 需按京东API要求生成时间戳
"format": "json",
"v": "1.0",
"productId": product_id,
# 其他必要参数(如签名)需按京东API文档生成
}
# 生成签名(此处省略签名生成逻辑,需按京东API文档实现)
# params["sign"] = generate_sign(params, APP_SECRET)
response = requests.get(API_URL, params=params)
if response.status_code == 200:
return response.json()
else:
raise Exception(f"API请求失败:{response.status_code}")
def parse_product_base_info(product_data):
"""解析商品基本信息"""
base_info = {
"product_id": product_data.get("productId"),
"product_name": product_data.get("productName"),
"brand_name": product_data.get("brandName"),
"price": product_data.get("price"),
"market_price": product_data.get("marketPrice"),
}
return base_info
def parse_specification(spec_data):
"""解析商品规格参数"""
specs = []
for spec in spec_data.get("specs", []):
spec_name = spec.get("specName")
spec_values = spec.get("specValues", [])
specs.append({
"spec_name": spec_name,
"spec_values": spec_values
})
return specs
def parse_skus(sku_list):
"""解析SKU数据,构建规格-SKU映射表"""
sku_map = {}
sku_list_clean = []
for sku in sku_list:
sku_id = sku.get("skuId")
sku_name = sku.get("skuName")
price = sku.get("price")
stock = sku.get("stock")
spec_info = sku.get("specInfo", {})
image_url = sku.get("imageUrl")
# 构建规格组合键(如"颜色:白色,版本:标准版")
spec_key = ",".join([f"{k}:{v}" for k, v in spec_info.items()])
# 清洗SKU数据
sku_clean = {
"sku_id": sku_id,
"sku_name": sku_name,
"price": float(price) if price else 0.0,
"stock": int(stock) if stock else 0,
"spec_info": spec_info,
"image_url": image_url
}
sku_list_clean.append(sku_clean)
sku_map[spec_key] = sku_clean
return sku_list_clean, sku_map
def main():
# 示例:获取商品ID为123456的详情
product_id = 123456
try:
# 调用API获取响应
response = get_jd_product_detail(product_id)
# 检查响应状态
if response.get("code") != 0:
raise Exception(f"API返回错误:{response.get('message')}")
# 提取商品主体数据
product_data = response.get("data", {}).get("product", {})
if not product_data:
raise Exception("未获取到商品数据")
# 分层解析数据
base_info = parse_product_base_info(product_data)
specs = parse_specification(product_data.get("specification", {}))
sku_list, sku_map = parse_skus(product_data.get("skus", []))
# 打印解析结果
print("商品基本信息:")
print(json.dumps(base_info, indent=2, ensure_ascii=False))
print("\n商品规格参数:")
print(json.dumps(specs, indent=2, ensure_ascii=False))
print("\nSKU列表:")
print(json.dumps(sku_list, indent=2, ensure_ascii=False))
print("\n规格-SKU映射表:")
for spec_key, sku in sku_map.items():
print(f"{spec_key} -> SKU_ID: {sku['sku_id']}, 价格: {sku['price']}")
except Exception as e:
print(f"处理失败:{str(e)}")
if __name__ == "__main__":
main()
3. 代码说明
- API 请求:通过
requests库调用京东商品详情 API,需按文档要求生成签名和时间戳; - 分层解析:将商品数据分为基本信息、规格参数、SKU 数据三层,分别通过专门函数解析;
- SKU 映射表:通过规格组合键(如 "颜色:白色,版本:标准版")将 SKU 与规格关联,便于快速查询;
- 数据清洗:对价格、库存等字段进行类型转换,确保数据格式统一。
五、进阶应用:SKU 数据的可视化与分析
解析后的 SKU 数据可用于多种场景:
- 价格对比:分析不同规格 SKU 的价格差异,识别高性价比 SKU;
- 库存监控:实时跟踪 SKU 库存变化,预测断货风险;
- 规格组合优化:通过分析 SKU 销售数据,优化商品规格组合(如增加热门颜色的生产);
- 可视化展示:使用 Matplotlib、Plotly 等库绘制 SKU 价格分布、库存趋势图。
六、注意事项
- API 权限:京东平台 API 需申请相应权限,部分接口可能收费;
- 签名验证:京东 API 采用签名机制,需严格按照文档生成签名,否则请求会失败;
- 数据缓存:频繁调用 API 可能导致限流,建议对商品数据进行缓存(如使用 Redis);
- 异常处理:需考虑网络超时、API 返回错误、字段缺失等异常情况,增强代码健壮性。
七、总结
京东商品 API 响应的处理核心在于分层解析嵌套 JSON和构建结构化 SKU 数据模型。通过本文介绍的方法,可以高效提取商品基本信息、规格参数和 SKU 数据,并进行清洗和标准化处理。实战代码示例展示了从 API 请求到数据解析的完整流程,可直接应用于实际项目中。在实际应用中,还可以根据业务需求扩展数据处理逻辑,实现 SKU 数据的深度分析和可视化。

4188

被折叠的 条评论
为什么被折叠?



