You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 06:31:24