任意复杂度的 JSON 数据转换为多个结构化的 Pandas DataFrame 表格
以下是一个 完整、结构清晰、可运行的 Python 工具,用于将任意复杂度的 JSON 数据转换为多个结构化的 Pandas DataFrame 表格。该工具支持嵌套对象、嵌套数组,并通过主键和外键建立表之间的关联关系。
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)# 获取生成的 DataFramedfs = converter.to_dataframes()# 打印结果for table_name, df in dfs.items():print(f"Table: {table_name}")print(df)print()
import pandas as pd
from collections import defaultdictclass JsonToTablesConverter:def __init__(self):self.tables = defaultdict(list) # 存储所有表的记录self.id_counter = 0 # 主键生成器def generate_id(self):"""生成自增主键"""self.id_counter += 1return self.id_counterdef 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_idelif 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_idelif 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