如何加载含多对象及可变字段的JSON文件至DataFrame
解决嵌套JSON转扁平DataFrame的问题
核心问题分析
你的JSON是多层嵌套结构(比如ingestionHeader、protectionInfo都是子对象),直接用pd.read_json会把整个子对象当成单个列的值,导致格式混乱。要实现和源DataFrame对比,必须先把嵌套结构扁平化为单层列。
解决方案步骤
1. 加载JSON并扁平化嵌套结构
用pandas.json_normalize()替代pd.read_json(),这个方法专门处理嵌套JSON,会自动把嵌套字段展开为父字段.子字段的格式:
import pandas as pd import json # 加载API返回的JSON(单条记录) with open("api_response.json", "r", encoding="utf-8") as f: data = json.load(f) # 扁平化嵌套结构生成DataFrame df_api = pd.json_normalize(data)
如果API返回的是多条记录的JSON数组,直接传入数组即可:
df_api = pd.json_normalize(json.load(f))
2. 处理字段可变的情况
如果不同JSON文件的字段不一致,需要统一列名对齐源DataFrame:
# 获取源DataFrame的列名列表 source_cols = df_source.columns.tolist() # 对齐列名,缺失列填充None df_api_aligned = df_api.reindex(columns=source_cols, fill_value=None)
3. 对比列名和值
对比列名
检查两个DataFrame的列是否完全一致:
cols_match = set(df_api_aligned.columns) == set(df_source.columns) if not cols_match: missing_in_api = set(df_source.columns) - set(df_api_aligned.columns) extra_in_api = set(df_api_aligned.columns) - set(df_source.columns) print(f"源DataFrame有但API返回缺失的列:{missing_in_api}") print(f"API返回有但源DataFrame没有的列:{extra_in_api}")
对比值
用pandas.testing.assert_frame_equal()做自动化测试断言,可灵活忽略类型或顺序差异:
from pandas.testing import assert_frame_equal try: assert_frame_equal(df_api_aligned, df_source, check_dtype=False) print("所有列值完全匹配!") except AssertionError as e: print("值不匹配:", e)
如果只需对比关键列,可指定列子集:
key_cols = ["ingestionHeader.recordUUID", "address.state"] assert_frame_equal(df_api_aligned[key_cols], df_source[key_cols])
示例效果
以你提供的JSON为例,扁平化后列名会变成:
ingestionHeader.geoingestionHeader.dataDomainprotectionInfo.unprotectedaddress.state- ...(所有嵌套字段都会展开为单层结构)
这样生成的DataFrame就可以和源DataFrame直接对比了。
内容的提问来源于stack exchange,提问作者Tw1ster
相关产品推荐
相关产品推荐

