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

如何加载含多对象及可变字段的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.geo
  • ingestionHeader.dataDomain
  • protectionInfo.unprotected
  • address.state
  • ...(所有嵌套字段都会展开为单层结构)

这样生成的DataFrame就可以和源DataFrame直接对比了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 11:45:13