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

如何在Python3中基于指定JSON Schema生成对象?求更优方案

基于JSON Schema生成Python对象的替代方案

你当前使用的python-jsonschema-objects是可行方案,但Python生态里有几个更成熟、功能更丰富的替代选择,以下是具体实现:

1. Pydantic(推荐)

Pydantic是当前Python生态中最流行的数据建模与校验库,原生支持JSON Schema的双向转换(从模型生成Schema、从Schema生成模型),自带类型提示,性能优异,还能与FastAPI等主流框架无缝集成。

安装

pip install pydantic

实现示例

方式1:直接定义对应模型(可导出为JSON Schema)

from pydantic import BaseModel, Field
from typing import List, Optional, Union

class Person(BaseModel):
    firstName: str
    lastName: str
    age: Optional[int] = Field(None, description="Age in years", ge=0)
    dogs: Optional[List[str]] = Field(None, max_items=4)
    gender: Optional[str] = Field(None, enum=["male", "female"])
    deceased: Optional[Union[str, int, bool]] = Field(None, enum=["yes", "no", 1, 0, "true", "false"])

# 创建并验证对象
person = Person(
    firstName="John",
    lastName="Doe",
    age=30,
    dogs=["Buddy"],
    gender="male",
    deceased="no"
)
print(person)

方式2:直接从JSON Schema加载模型

from pydantic import TypeAdapter
import json

# 你的原始JSON Schema
schema = '''{
    "title": "Example Schema",
    "type": "object",
    "properties": {
        "firstName": {"type": "string"},
        "lastName": {"type": "string"},
        "age": {"description": "Age in years", "type": "integer", "minimum": 0},
        "dogs": {"type": "array", "items": {"type": "string"}, "maxItems": 4},
        "gender": {"type": "string", "enum": ["male", "female"]},
        "deceased": {"enum": ["yes", "no", 1, 0, "true", "false"]}
    },
    "required": ["firstName", "lastName"]
}'''

# 从Schema创建适配器
person_adapter = TypeAdapter(json.loads(schema))
# 验证并转换数据为对象
validated_data = person_adapter.validate_python({
    "firstName": "Jane",
    "lastName": "Smith",
    "age": 25,
    "deceased": 0
})
print(validated_data)

2. Marshmallow

Marshmallow是老牌的序列化/反序列化库,专注于数据转换与校验,支持JSON Schema,灵活性极高,适合需要自定义复杂校验逻辑的场景。

安装

pip install marshmallow marshmallow-jsonschema

实现示例

from marshmallow import Schema, fields, validate
import json

class PersonSchema(Schema):
    firstName = fields.Str(required=True)
    lastName = fields.Str(required=True)
    age = fields.Int(description="Age in years", validate=validate.Range(min=0), allow_none=True)
    dogs = fields.List(fields.Str(), validate=validate.Length(max=4), allow_none=True)
    gender = fields.Str(validate=validate.OneOf(["male", "female"]), allow_none=True)
    deceased = fields.Field(validate=validate.OneOf(["yes", "no", 1, 0, "true", "false"]), allow_none=True)

# 验证并转换数据
data = {
    "firstName": "Bob",
    "lastName": "Brown",
    "dogs": ["Max", "Bella"],
    "gender": "female"
}
result = PersonSchema().load(data)
print(result)

# 也可从JSON Schema反向生成Marshmallow Schema结构
schema_json = json.loads(schema)
from marshmallow_jsonschema import JSONSchema
print(JSONSchema().dump(PersonSchema()))

3. Attrs + Cattrs + jsonschema

如果你偏好轻量级的类定义,可组合使用attrs(简化类定义)、cattrs(序列化/反序列化)和jsonschema(数据校验),这套组合灵活且轻量。

安装

pip install attrs cattrs jsonschema

实现示例

import attr
import cattrs
import jsonschema
import json

# 定义轻量级类
@attr.s(auto_attribs=True)
class Person:
    firstName: str
    lastName: str
    age: int = attr.ib(default=None, validator=attr.validators.optional(attr.validators.instance_of(int)))
    dogs: list[str] = attr.ib(default=None, validator=attr.validators.optional(attr.validators.instance_of(list)))
    gender: str = attr.ib(default=None, validator=attr.validators.optional(attr.validators.in_(["male", "female"])))
    deceased: str | int | bool = attr.ib(default=None, validator=attr.validators.optional(attr.validators.in_(["yes", "no", 1, 0, "true", "false"])))

# 加载并校验JSON Schema
schema_json = json.loads(schema)
data = {
    "firstName": "Alice",
    "lastName": "Davis",
    "age": 35,
    "deceased": "true"
}

# 先校验数据合法性
jsonschema.validate(instance=data, schema=schema_json)
# 将校验后的数据转换为对象
person = cattrs.structure(data, Person)
print(person)

方案选择建议

  • 优先选Pydantic:适合大多数现代Python项目,类型友好、功能全面、性能出色。
  • 选Marshmallow:需要高度自定义序列化/校验逻辑,或维护老项目时。
  • 选Attrs组合:追求轻量级、无侵入的类定义场景。

内容的提问来源于stack exchange,提问作者Momi Mimo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 02:39:09