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

从嵌套JSON中提取警告信息并生成标准化Pandas DataFrame

从嵌套JSON中提取警告信息并生成标准化Pandas DataFrame

嘿,我完全懂你现在的处境——面对这种层级深、文档又不完善的API返回JSON,要把里面的警告信息规整成好用的DataFrame确实挺折腾的。咱们来一步步把这个问题拆解,写出更优雅的代码来解决它。

第一步:安全提取警告数据,避免繁琐的多层判断

你原来的多层if判断确实不够优雅,而且一旦JSON结构有变动还容易抛出KeyError。咱们可以用Python字典的get()方法来安全导航嵌套结构,同时快速判断是否存在有效警告:

import pandas as pd
import json

# 假设你已经通过API获取到了JSON数据,存放在jd变量中
jd = getSync.json()

# 可选:将JSON写入文件方便调试
with open("output.json", mode="w") as fh:
    json.dump(jd, fh, indent=4, separators=(",", ":"))

# 安全提取警告数据,每层都设置默认空字典,避免KeyError
warnings_data = jd.get("data", {}).get("attributes", {}).get("result", {}).get("warnings", {})

# 检查是否存在非空的警告条目
has_warnings = any(len(items) > 0 for items in warnings_data.values())

if not has_warnings:
    print("未检测到任何警告信息")
else:
    # 后续处理逻辑放在这里
    pass

这样不管JSON里某一层不存在,代码都不会报错,而且一行就搞定了警告数据的提取,比多层if清爽多了。

第二步:生成符合需求的标准化DataFrame

接下来要把嵌套的警告数据转换成你想要的格式——核心需求是:每个警告类别(terms/teachers/courses/enrollments)对应行,警告列表里的每个元素单独占一行,空列表也要保留对应的警告记录。

咱们可以先构建一个空列表来存储每条标准化的记录,然后遍历警告数据的每个类别和条目,逐个处理:

if has_warnings:
    warning_records = []
    
    # 遍历每个警告类别(比如teachers、enrollments)
    for warning_category, warning_items in warnings_data.items():
        # 遍历当前类别下的每一条警告
        for warning_item in warning_items:
            # 提取当前警告的基础信息
            warn_type = warning_item.get("type")
            warn_message = warning_item.get("message")
            warn_list = warning_item.get("list", [])
            
            # 如果警告列表不为空,每个元素生成一条独立记录
            if warn_list:
                for elem in warn_list:
                    warning_records.append({
                        "warnings": warning_category,
                        "warning.type": warn_type,
                        "warnings.message": warn_message,
                        "warnings.list": elem
                    })
            # 如果警告列表为空,生成一条带空值的记录
            else:
                warning_records.append({
                    "warnings": warning_category,
                    "warning.type": warn_type,
                    "warnings.message": warn_message,
                    "warnings.list": None
                })
    
    # 把记录列表转换成Pandas DataFrame
    warnings_df = pd.DataFrame(warning_records)
    print(warnings_df)

用你提供的JSON数据测试这段代码,生成的DataFrame会完全符合你的预期:

  • teachers类别会有一行记录,warnings.list为None
  • enrollments类别会生成三行记录,分别对应"E"、"r"、"o"
  • terms和courses因为没有警告条目,不会出现在结果里

额外说明

这个方案的好处是:

  • 兼容性强:不管JSON里某一层缺失,或者警告列表为空,代码都能正常处理
  • 扩展性好:如果以后API新增了其他警告类别,代码不需要修改就能自动适配
  • 可读性高:逻辑清晰,比你原来的json_normalize写法更容易维护

备注:内容来源于stack exchange,提问作者SFDonovan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 15:44:37