API深层嵌套JSON转带字段名的Pandas DataFrame遇解析问题
解决深层嵌套JSON到Pandas DataFrame的解析问题
我之前也踩过类似深层嵌套JSON解析的坑,尤其是当响应里带数组类型的字段时,json_normalize默认的行为经常达不到预期。结合你描述的结构,咱们一步步来搞定这个问题:
1. 先把API响应转成Python可处理的JSON对象
首先得确保你能正确获取并解析API响应。如果你之前用curl,直接转成Python的requests调用会更方便后续处理:
import requests import pandas as pd from pandas import json_normalize # 替换成你实际的API地址、请求头和参数 url = "https://your-api-endpoint.com/xxx" headers = { "Content-Type": "application/json", "Authorization": "Bearer YOUR_AUTH_TOKEN" # 如果需要认证的话 } payload = { # 这里放curl里的请求体内容,比如查询参数等 } # 发送请求并解析JSON response = requests.post(url, headers=headers, json=payload) api_data = response.json()
2. 定位目标数据层级
根据你描述的结构,目标数据在response->accounts->hits下,先把这部分提取出来:
# 提取hits数组 hits_data = api_data["response"]["accounts"]["hits"]
3. 处理棘手的selected_fields数组
这应该是你用json_normalize没得到预期结果的核心原因——selected_fields是数组,默认情况下json_normalize不会把它转成单独的列。这里分两种情况处理:
情况A:selected_fields是键值对数组(比如[{"field": "account_id", "value": "123"}, ...])
如果是这种结构,我们可以先把每个hit里的selected_fields转成字典,再合并到hit对象中,这样json_normalize就能把它们解析成单独的列:
for hit in hits_data: if "selected_fields" in hit: # 把selected_fields数组转成键值对字典 field_mapping = {item["field"]: item["value"] for item in hit["selected_fields"]} # 合并到hit对象,删除原数组 hit.update(field_mapping) del hit["selected_fields"]
情况B:selected_fields是普通值数组(比如["val1", "val2", "val3"])
如果只是普通值数组,你可以选择直接保留为DataFrame的列表类型列,或者用explode展开成多行:
# 直接保留数组列 df = json_normalize(hits_data) # 或者展开数组成多行(如果需要的话) df_exploded = df.explode("selected_fields", ignore_index=True)
4. 生成最终DataFrame并补充顶层字段
现在用json_normalize处理整理后的hits_data,如果需要把顶层的took、_revision等字段也存入DataFrame,直接批量添加即可:
# 生成基础DataFrame df = json_normalize(hits_data) # 添加顶层的全局字段 df["took"] = api_data["took"] df["_revision"] = api_data["_revision"] # 查看结果 print(df.head())
额外调试技巧
如果还是不符合预期,先打印hits_data的第一条数据,确认结构:
import json print(json.dumps(hits_data[0], indent=2))
这样能清楚看到每个字段的层级,再调整json_normalize的record_path或meta参数(比如如果hits里还有更深的嵌套,可以指定record_path到具体层级)。
内容的提问来源于stack exchange,提问作者Tango_charlie
相关产品推荐
相关产品推荐

