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

Python使用Pandas解析嵌套JSON并写入Excel时的嵌套字段提取报错解决方案咨询

解决pandas json_normalize处理嵌套数组字段的KeyError问题

我来帮你搞定这个嵌套字段提取的问题!你遇到的KeyError是因为scopeRoles是一个数组类型的字段,pd.json_normalize默认不会自动展开数组里的嵌套对象属性,所以直接用scopeRoles.name是找不到对应的列的。下面给你两种可行的解决方案:


方案1:展开嵌套数组生成多行数据

如果你的scopeRoles里可能有多个条目,想把每个条目单独作为一行,同时保留顶层的用户信息,可以在json_normalize时指定record_path和meta参数:

import pandas as pd

# 你的原始JSON数据
result = {
    "apiToken": {"createdAt": "2022-03-04T12:18:29.000956Z", "expiresAt": "2022-09-04T12:18:29.000956Z"},
    "canGenerateApiToken": True,
    "dateJoined": "2021-01-29T10:07:04.395172Z",
    "email": "john@doe.com",
    "emailReadOnly": True,
    "emailVerified": True,
    "firstLogin": "2021-01-29T13:01:33.294216Z",
    "fullName": "John Doe",
    "fullNameReadOnly": True,
    "groupsReadOnly": False,
    "id": "32168415841",
    "isSystem": False,
    "lastLogin": "2022-09-12T08:51:00.159750Z",
    "lowestRole": "Admin",
    "primaryTwoFaMethod": "application",
    "scope": "account",
    "scopeRoles": [{"id": "68418945648943589", "name": "AT || ACME Inc.", "roleId": "9848949354653168", "roleName": "Admin", "roles": ["Admin"]}],
    "siteRoles": [],
    "source": "sso_saml",
    "tenantRoles": [],
    "twoFaEnabled": True
}

# 展开scopeRoles数组,同时保留顶层的用户字段
df = pd.json_normalize(
    data=result,
    record_path="scopeRoles",  # 指定要展开的数组字段
    meta=["scope", "fullName", "email", "lowestRole"]  # 需要保留的顶层字段
)

# 现在可以直接选择name列写入Excel
df[["scope", "fullName", "email", "lowestRole", "name"]].to_excel(completename, index=False)

这种方式会把每个scopeRoles条目作为一行,适合一个用户有多个角色组的场景。


方案2:合并数组中的name到单个单元格

如果希望每个用户只占一行,把所有scopeRoles的name合并成一个字符串(比如用逗号分隔),可以先正常归一化,再用apply处理数组字段:

import pandas as pd

df = pd.json_normalize(result)

# 提取scopeRoles中的name,合并为单个字符串
df["scopeRoles_name"] = df["scopeRoles"].apply(
    lambda roles: ", ".join([role["name"] for role in roles]) if roles else ""
)

# 选择需要的列写入Excel
df[["scope", "fullName", "email", "lowestRole", "scopeRoles_name"]].to_excel(completename, index=False)

这种方式适合你只需要展示用户关联的所有角色组名称,不需要展开成多行的场景。


为什么原来的代码会报错?

pd.json_normalize默认只会处理顶层的非数组字段,对于数组类型的字段(比如scopeRoles),它会直接保留为列表对象,不会自动展开成scopeRoles.name这样的列名,所以你直接访问这个列名就会触发KeyError。

内容的提问来源于stack exchange,提问作者f0rd42

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 15:04:07