任意复杂度的 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 小时前
v-scale-scree: 根据屏幕尺寸缩放内容
开发语言·前端·javascript
fouryears_234175 小时前
Flutter InheritedWidget 详解:从生命周期到数据流动的完整解析
开发语言·flutter·客户端·dart
我好喜欢你~5 小时前
C#---StopWatch类
开发语言·c#
lifallen6 小时前
Java Stream sort算子实现:SortedOps
java·开发语言
IT毕设实战小研6 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
wyiyiyi7 小时前
【Web后端】Django、flask及其场景——以构建系统原型为例
前端·数据库·后端·python·django·flask
mit6.8247 小时前
[1Prompt1Story] 滑动窗口机制 | 图像生成管线 | VAE变分自编码器 | UNet去噪神经网络
人工智能·python
没有bug.的程序员7 小时前
JVM 总览与运行原理:深入Java虚拟机的核心引擎
java·jvm·python·虚拟机
甄超锋8 小时前
Java ArrayList的介绍及用法
java·windows·spring boot·python·spring·spring cloud·tomcat
cui__OaO8 小时前
Linux软件编程--线程
linux·开发语言·线程·互斥锁·死锁·信号量·嵌入式学习