如何解析嵌套JSON API响应并转换为表格格式
解决方案
1. 先提取目标数据数组
首先从API响应中精准抽出result.records数组,这是后续处理的核心数据源:
import pandas as pd import json # 假设API响应已加载为json对象(或从本地文件读取) with open('boston_gov_data.json', 'r') as f: raw_data = json.load(f) # 提取需要处理的records数组 target_records = raw_data['result']['records']
2. 正确使用json_normalize处理嵌套结构
之前两次使用未达预期,大概率是参数配置问题。根据嵌套类型选择对应用法:
场景A:嵌套字段为字典对象
如果每条record包含层级字典(如contact_info),直接调用json_normalize会自动展开第一层嵌套,生成带.分隔符的列名:
# 自动展开所有层级嵌套(默认行为) df = pd.json_normalize(target_records) # 若需限制展开层级,指定max_level参数 # df = pd.json_normalize(target_records, max_level=1)
场景B:嵌套字段为数组列表
如果record包含数组型嵌套(如related_permits),需通过record_path指定展开的数组路径,并用meta保留顶层字段:
# 展开nested_array字段,同时保留顶层的id和name字段 df = pd.json_normalize( target_records, record_path='nested_array', # 要展开的数组字段名 meta=['id', 'name'] # 需保留的顶层字段 )
3. 用flatten_json正确扁平化(修正之前的错误)
之前得到1行多列的问题,是因为你直接扁平化了整个records数组,而非遍历每条record单独扁平化。正确用法:
from flatten_json import flatten # 遍历每条record,单独扁平化后生成新列表 flattened_records = [flatten(record) for record in target_records] df = pd.DataFrame(flattened_records)
此方法会将所有深层嵌套字段展开为parent_child格式的列名,每条record对应DataFrame的一行。
4. 自定义递归扁平化(灵活控制格式)
如果需要自定义列名分隔符或处理特殊嵌套(如数组内的对象),可编写递归函数:
def flatten_record(record, parent_key='', sep='_'): flattened = {} for key, value in record.items(): new_key = f"{parent_key}{sep}{key}" if parent_key else key if isinstance(value, dict): # 递归处理字典类型的嵌套 flattened.update(flatten_record(value, new_key, sep)) elif isinstance(value, list): # 数组处理:可选转为字符串,或进一步展开数组内的对象 flattened[new_key] = str(value) # 若需展开数组内的对象,替换为以下代码: # for idx, item in enumerate(value): # flattened.update(flatten_record(item, f"{new_key}_{idx}", sep)) else: flattened[new_key] = value return flattened # 应用到所有record flattened_records = [flatten_record(rec) for rec in target_records] df = pd.DataFrame(flattened_records)
验证输出
最后检查DataFrame结构,确认每条原始record对应一行,嵌套字段均展开为独立列:
print(df.head()) print("列名列表:", df.columns.tolist())
内容的提问来源于stack exchange,提问作者dapperAF
相关产品推荐
相关产品推荐

