Python提取API返回JSON指定字段 展开嵌套数据生成目标CSV
实现方案
需求说明
- 从API返回的JSON响应中提取
results键下的id、unid、userHierarchies三类字段,忽略其余无关数据 - 导出CSV固定表头为
id,unid,hierarchyField,value - 将每条用户记录下嵌套的
userHierarchies数组拆分为多行,每个层级条目单独占一行,每行携带所属用户的id、unid值 - 原有直接将
results列表转pandas DataFrame导出的方案,无法完成嵌套数组的展开拆分,无法生成符合格式要求的文件
原始JSON结构示例
{ "code": 200, "msg": "success", "results": [ { "id": 1001, "unid": "u_abc123", "name": "张三", "email": "zhangsan@example.com", "userHierarchies": [ {"hierarchyField": "department", "value": "技术部"}, {"hierarchyField": "position", "value": "后端开发"}, {"hierarchyField": "region", "value": "华东区"} ] }, { "id": 1002, "unid": "u_def456", "name": "李四", "email": "lisi@example.com", "userHierarchies": [ {"hierarchyField": "department", "value": "产品部"}, {"hierarchyField": "position", "value": "产品经理"} ] } ] }
目标CSV格式样例
id,unid,hierarchyField,value 1001,u_abc123,department,技术部 1001,u_abc123,position,后端开发 1001,u_abc123,region,华东区 1002,u_def456,department,产品部 1002,u_def456,position,产品经理
原有错误实现
import pandas as pd import requests # 调用API获取响应 resp = requests.get("your_api_address") json_data = resp.json() # 错误逻辑:直接转换DataFrame无法拆分嵌套的userHierarchies数组 df = pd.DataFrame(json_data["results"]) df.to_csv("user_export.csv", index=False)
可直接运行的正确代码
方案1:pandas内置方法实现(代码最简洁)
利用pandas的explode方法拆分嵌套数组,再展开字典字段为独立列:
import pandas as pd import requests # 拉取API数据 resp = requests.get("your_api_address") json_data = resp.json() source_data = json_data["results"] # 第一步:过滤无关字段,仅保留需要的三类数据 filtered_data = [ { "id": item["id"], "unid": item["unid"], "userHierarchies": item["userHierarchies"] } for item in source_data ] # 第二步:拆分嵌套数组为多行 df = pd.DataFrame(filtered_data) df = df.explode("userHierarchies", ignore_index=True) # 拆分层级字典为独立列 df = pd.concat( [df.drop(columns=["userHierarchies"]), df["userHierarchies"].apply(pd.Series)], axis=1 ) # 第三步:按指定列顺序导出CSV df = df[["id", "unid", "hierarchyField", "value"]] df.to_csv("user_hierarchy_export.csv", index=False, encoding="utf-8-sig")
方案2:原生Python实现(无pandas依赖,适合轻量场景)
逐行遍历构造导出数据,用标准库csv模块写入文件,不需要安装第三方数据处理库:
import csv import requests # 拉取API数据 resp = requests.get("your_api_address") json_data = resp.json() source_data = json_data["results"] # 逐行构造导出记录 export_rows = [] for user_info in source_data: uid = user_info["id"] unid = user_info["unid"] # 遍历每个层级条目,关联用户基础信息 for hierarchy_item in user_info["userHierarchies"]: export_rows.append({ "id": uid, "unid": unid, "hierarchyField": hierarchy_item["hierarchyField"], "value": hierarchy_item["value"] }) # 写入CSV文件 with open("user_hierarchy_export.csv", "w", encoding="utf-8-sig", newline="") as f: writer = csv.DictWriter(f, fieldnames=["id", "unid", "hierarchyField", "value"]) writer.writeheader() writer.writerows(export_rows)
注意事项
- 导出时使用
utf-8-sig编码可避免Windows环境下用Excel打开CSV时出现中文乱码 - 若接口返回的
userHierarchies存在空数组,上述两种方案会自动跳过该用户的层级记录,不会生成无效空行;如果需要保留空记录,可在遍历逻辑前增加判断补全默认值 - pandas方案要求pandas版本不低于1.1.0,该版本开始
explode方法原生支持ignore_index参数
内容的提问来源于stack exchange,提问作者ghj
相关产品推荐
相关产品推荐

