以下是一個 完整、結構清晰、可運行的 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