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

如何用Python的json_normalize一次性解析含两个数组的JSON?

单次用json_normalize解析含双数组的JSON数据

可以通过先预处理生成两个数组的笛卡尔积记录,再单次调用json_normalize完成解析,无需分两次再交叉连接。

示例JSON数据

{
  "id": "0001",
  "type": "donut",
  "name": "Cake",
  "ppu": 0.55,
  "batters": {
    "batter": [
      { "id": "1001", "type": "Regular" },
      { "id": "1002", "type": "Chocolate" },
      { "id": "1003", "type": "Blueberry" }
    ]
  },
  "topping": [
    { "id": "5001", "type": "None" },
    { "id": "5002", "type": "Glazed" },
    { "id": "5005", "type": "Sugar" }
  ]
}

实现代码

import pandas as pd
from itertools import product

# 加载你的JSON数据(这里用示例数据)
data = {
  "id": "0001",
  "type": "donut",
  "name": "Cake",
  "ppu": 0.55,
  "batters": {
    "batter": [
      { "id": "1001", "type": "Regular" },
      { "id": "1002", "type": "Chocolate" },
      { "id": "1003", "type": "Blueberry" }
    ]
  },
  "topping": [
    { "id": "5001", "type": "None" },
    { "id": "5002", "type": "Glazed" },
    { "id": "5005", "type": "Sugar" }
  ]
}

# 生成batter和topping的笛卡尔积记录,同时保留原数据的其他字段
records = [
    {**batter, **topping, **{k: v for k, v in data.items() if k not in ["batters", "topping"]}}
    for batter, topping in product(data["batters"]["batter"], data["topping"])
]

# 单次调用json_normalize解析
df = pd.json_normalize(records)
print(df)

说明

  1. 用itertools.product生成batters.batter和topping两个数组的笛卡尔积,得到所有可能的组合
  2. 把每个组合和原数据中不属于数组的字段(如id、type、name等)合并成单个记录
  3. 最后用pd.json_normalize解析这个记录数组,直接得到包含所有交叉组合的DataFrame

这种方式本质上是先做数据预处理,再单次调用json_normalize,避免了分两次解析再交叉连接的繁琐步骤。

内容的提问来源于stack exchange,提问作者Semyon-coder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 02:30:44