以下是一个 完整、结构清晰、可运行的 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