任意复杂度的 JSON 数据转换为多个结构化的 Pandas DataFrame 表格

以下是一个 完整、结构清晰、可运行的 Python 工具,用于将任意复杂度的 JSON 数据转换为多个结构化的 Pandas DataFrame 表格。该工具支持嵌套对象、嵌套数组,并通过主键和外键建立表之间的关联关系。

python 复制代码
if __name__ == "__main__":
    # 示例 JSON 数据
    json_data = {
        "name": "Alice",
        "age": 28,
        "address": {
            "city": "Chicago",
            "zip": "60601"
        },
        "hobbies": [
            {"name": "Reading", "level": "Intermediate"},
            {"name": "Cooking", "level": "Advanced"}
        ]
    }

    # 初始化转换器
    converter = JsonToTablesConverter()

    # 执行转换
    converter.flatten(json_data)

    # 获取生成的 DataFrame
    dfs = converter.to_dataframes()

    # 打印结果
    for table_name, df in dfs.items():
        print(f"Table: {table_name}")
        print(df)
        print()
python 复制代码
import pandas as pd
from collections import defaultdict

class JsonToTablesConverter:
    def __init__(self):
        self.tables = defaultdict(list)  # 存储所有表的记录
        self.id_counter = 0              # 主键生成器

    def generate_id(self):
        """生成自增主键"""
        self.id_counter += 1
        return self.id_counter

    def flatten(self, data, table_name="root", parent_id=None):
        """
        递归处理 JSON 数据,生成结构化表
        :param data: JSON 数据(字典或列表)
        :param table_name: 当前处理的表名
        :param parent_id: 父表主键(用于外键引用)
        :return: 返回当前结构的主键 ID
        """
        if isinstance(data, dict):
            # 当前表的主键
            current_id = self.generate_id()
            record = {f"{table_name}_id": current_id}

            # 如果有父表,添加外键
            if parent_id is not None:
                record["parent_id"] = parent_id

            # 遍历字典中的每个字段
            for key, value in data.items():
                if isinstance(value, dict):
                    # 嵌套对象:递归处理,返回子表主键
                    child_id = self.flatten(value, f"{table_name}_{key}", current_id)
                    record[f"{key}_id"] = child_id
                elif isinstance(value, list):
                    # 嵌套数组:递归处理每个元素
                    for item in value:
                        self.flatten(item, f"{table_name}_{key}", current_id)
                else:
                    # 基本类型字段:直接作为当前表的列
                    record[key] = value

            # 将当前记录添加到对应表中
            self.tables[table_name].append(record)
            return current_id

        elif isinstance(data, list):
            # 处理数组中的每个元素
            for item in data:
                self.flatten(item, table_name, parent_id)

    def to_dataframes(self):
        """
        将收集的表数据转换为 Pandas DataFrame
        :return: 字典形式的 {表名: DataFrame}
        """
        return {name: pd.DataFrame(records) for name, records in self.tables.items()}

    def reset(self):
        """重置状态,用于多次转换"""
        self.tables.clear()
        self.id_counter = 0
相关推荐
крон2 小时前
【Auto.js例程】华为备忘录导出到其他手机
开发语言·javascript·智能手机
zh_xuan3 小时前
c++ 单例模式
开发语言·c++·单例模式
老胖闲聊3 小时前
Python Copilot【代码辅助工具】 简介
开发语言·python·copilot
Blossom.1183 小时前
使用Python和Scikit-Learn实现机器学习模型调优
开发语言·人工智能·python·深度学习·目标检测·机器学习·scikit-learn
曹勖之4 小时前
基于ROS2,撰写python脚本,根据给定的舵-桨动力学模型实现动力学更新
开发语言·python·机器人·ros2
豆沙沙包?4 小时前
2025年- H77-Lc185--45.跳跃游戏II(贪心)--Java版
java·开发语言·游戏
军训猫猫头5 小时前
96.如何使用C#实现串口发送? C#例子
开发语言·c#
lyaihao5 小时前
使用python实现奔跑的线条效果
python·绘图
liuyang-neu5 小时前
java内存模型JMM
java·开发语言
ai大师5 小时前
(附代码及图示)Multi-Query 多查询策略详解
python·langchain·中转api·apikey·中转apikey·免费apikey·claude4