任意复杂度的 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
相关推荐
程序员-King.1 小时前
【Qt开源项目】— ModbusScope-day 5
开发语言·qt
Pyeako1 小时前
Python数据可视化--matplotlib库
python·matplotlib·数据可视化·画图·pylab
m0_704887891 小时前
Day 35
python·深度学习·机器学习
老秦包你会1 小时前
QT第五课------QT系统相关------线程
开发语言·qt
lkbhua莱克瓦241 小时前
IO练习——网络爬虫(爬取数据)
java·开发语言·爬虫·io流练习·java练习
华研前沿标杆游学1 小时前
参观深圳比亚迪总部,探索科技,感受中国“智”造魅力
python
net3m331 小时前
雅特力单片机用串口USART_INT_TDE中断比用USART_INT_TRAC的 发送效率要高
java·开发语言·算法
爱打代码的小林1 小时前
python基础(逻辑回归例题)
开发语言·python·逻辑回归
qq_214782612 小时前
pandas“将”迎来v3.0.0大版本更新!
python·pandas
dagouaofei2 小时前
长文档也能转成PPT:AI自动拆分章节并生成页面
人工智能·python·powerpoint