任意复杂度的 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
相关推荐
魔尔助理顾问1 小时前
Flask如何读取配置信息
python·flask·bootstrap
chxii1 小时前
5java集合框架
java·开发语言
老衲有点帅1 小时前
C#多线程Thread
开发语言·c#
C++ 老炮儿的技术栈2 小时前
什么是函数重载?为什么 C 不支持函数重载,而 C++能支持函数重载?
c语言·开发语言·c++·qt·算法
jc_hook2 小时前
Python 接入DeepSeek
python·大模型·deepseek
IsPrisoner2 小时前
Go语言安装proto并且使用gRPC服务(2025最新WINDOWS系统)
开发语言·后端·golang
Python私教2 小时前
征服Rust:从零到独立开发的实战进阶
服务器·开发语言·rust
chicpopoo2 小时前
Python打卡DAY25
开发语言·python
crazyme_63 小时前
深入掌握 Python 切片操作:解锁数据处理的高效密码
开发语言·python