从嵌套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
相关产品推荐
相关产品推荐

