任意复杂度的 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
相关推荐
猫头虎19 小时前
永久免费白嫖多个域名,一键托管Cloudflare,免费申请SSL加密证书,轻松建站、搭建线路伪装
服务器·开发语言·网络·数据库·python·网络协议·ssl
沙虫一号19 小时前
线上python问题排查思路
后端·python
无敌最俊朗@19 小时前
C++后端总览
开发语言
多喝开水少熬夜19 小时前
堆相关算法题基础-java实现
java·开发语言·算法
7澄120 小时前
Java 集合框架:List 体系与实现类深度解析
java·开发语言·vector·intellij-idea·集合·arraylist·linkedlist
B站_计算机毕业设计之家20 小时前
深度学习:Yolo水果检测识别系统 深度学习算法 pyqt界面 训练集测试集 深度学习 数据库 大数据 (建议收藏)✅
数据库·人工智能·python·深度学习·算法·yolo·pyqt
mit6.82420 小时前
一些C++的学习资料备忘
开发语言·c++
Adellle20 小时前
Java中同步和异步的区别,以及阻塞和非阻塞的区别
java·开发语言
闲人编程20 小时前
用Python分析你的Spotify/网易云音乐听歌数据
开发语言·python·ai·数据分析·spotify·网易云·codecapsule