You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于JSON文件自动生成Python类定义?

从JSON自动生成Python类定义的工具与方法

1. 使用Pydantic的create_model动态生成模型

Pydantic提供的create_model函数可以根据JSON数据的结构,动态生成对应的模型类,支持嵌套结构的自动推导。

示例代码:

from pydantic import create_model
import json

# 读取目标JSON文件
with open('target.json', 'r') as f:
    raw_data = json.load(f)

# 递归推导字段类型
def infer_field_type(val):
    if isinstance(val, str):
        return (str, ...)
    elif isinstance(val, int):
        return (int, ...)
    elif isinstance(val, float):
        return (float, ...)
    elif isinstance(val, bool):
        return (bool, ...)
    elif isinstance(val, dict):
        # 递归生成嵌套模型
        nested_model = create_model(f'Nested{val.__hash__()}', **{k: infer_field_type(v) for k, v in val.items()})
        return (nested_model, ...)
    elif isinstance(val, list):
        if val:
            elem_type = infer_field_type(val[0])[0]
            return (list[elem_type], ...)
        else:
            return (list, ...)
    return (object, ...)

# 生成顶层模型类
DynamicModel = create_model('DynamicModel', **{k: infer_field_type(v) for k, v in raw_data.items()})

# 实例化并使用
model_instance = DynamicModel(**raw_data)
print(model_instance.name)
print(model_instance.address.city)

2. 使用dataclass-wizard快速生成数据类

dataclass-wizard库支持直接从JSON字符串或字典生成Python dataclass,无需预先定义类结构,对嵌套结构的处理也很便捷。

示例代码:

from dataclass_wizard import json_to_dataclass
import json

with open('target.json', 'r') as f:
    json_content = f.read()

# 从JSON字符串直接生成dataclass
DynamicDataClass = json_to_dataclass(json_content)

# 从JSON实例化类对象
instance = DynamicDataClass.from_json(json_content)
print(instance.age)

3. 手动实现动态类生成(基于dataclasses)

如果不想依赖第三方库,可以借助Python的type函数和dataclasses模块,手动实现从JSON结构生成类的逻辑,灵活性更高。

示例代码:

from dataclasses import dataclass, field
import json

def build_dataclass(class_name, data_dict):
    field_defs = {}
    for key, value in data_dict.items():
        if isinstance(value, dict):
            # 递归创建嵌套数据类
            nested_cls = build_dataclass(f'{class_name}_{key.title()}', value)
            field_defs[key] = field(default_factory=nested_cls)
        elif isinstance(value, list):
            if value:
                elem = value[0]
                if isinstance(elem, dict):
                    elem_cls = build_dataclass(f'{class_name}_{key.title()}_Item', elem)
                    field_defs[key] = field(default_factory=lambda: [elem_cls()])
                else:
                    field_defs[key] = field(default_factory=lambda: [type(elem)()])
            else:
                field_defs[key] = field(default_factory=list)
        else:
            field_defs[key] = field(default=type(value)())
    return dataclass(type(class_name, (), field_defs))

# 使用示例
with open('target.json', 'r') as f:
    json_data = json.load(f)

CustomClass = build_dataclass('CustomClass', json_data)
instance = CustomClass(**json_data)
print(instance.email)

以上几种方式都不需要预先编写Python类,可直接读取JSON文件生成包含所有数据元素的类定义,满足需求。

内容的提问来源于stack exchange,提问作者Rocky Heckman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 21:55:07