You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

寻求支持JSON Meta Schema的Pydantic模型库及运行时解析JSON Schema至Pydantic模型的功能

嘿,这个问题我刚好研究过,给你梳理两个实用的方案:

方案1:用Pydantic原生功能实现运行时JSON Schema转模型

其实Pydantic本身就支持在运行时把JSON Schema直接解析成对应的Pydantic模型,完全不需要额外安装库。核心就是用BaseModel.from_json_schema()这个类方法,举个实际例子你一看就懂:

from pydantic import BaseModel

# 假设这是用户定义的JSON Schema
user_provided_schema = {
    "type": "object",
    "properties": {
        "username": {"type": "string", "minLength": 3},
        "age": {"type": "integer", "minimum": 18}
    },
    "required": ["username"]
}

# 一键转换成Pydantic模型
UserDefinedModel = BaseModel.from_json_schema(user_provided_schema)

# 现在就可以用这个模型做数据验证了
sample_data = {"username": "john_doe", "age": 25}
validated_data = UserDefinedModel(**sample_data)
print(validated_data)  # 输出: username='john_doe' age=25

这个方法完全满足你“运行时解析JSON Schema为Pydantic模型”的需求,而且是官方原生支持,稳定性有保障。

方案2:获取JSON Meta Schema对应的Pydantic模型

如果你需要专门的Pydantic模型来验证用户提交的JSON Schema本身是否符合规范(也就是基于JSON Meta Schema做校验),有两个途径:

方式A:手动生成通用Meta Schema模型

你可以直接把JSON官方的Meta Schema(比如Draft 7或2020-12版本)加载进来,用刚才的from_json_schema()方法生成对应的Pydantic模型:

import requests
from pydantic import BaseModel

# 加载JSON Schema Draft 2020-12的Meta Schema
meta_schema = requests.get("https://json-schema.org/draft/2020-12/schema").json()

# 生成对应的Pydantic模型
JsonMetaSchemaModel = BaseModel.from_json_schema(meta_schema)

# 用这个模型验证用户提交的Schema是否合规
user_submitted_schema = {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {"email": {"type": "string", "format": "email"}},
    "required": ["email"]
}

validated_schema = JsonMetaSchemaModel(**user_submitted_schema)

方式B:用现成库直接调用

如果不想手动处理Meta Schema的加载,可以用json-schema-pydantic这个第三方库,它已经封装了不同Draft版本的JSON Meta Schema对应的Pydantic模型。

先安装:

pip install json-schema-pydantic

然后使用:

from json_schema_pydantic import JsonSchemaDraft202012

# 直接用预定义的模型验证用户Schema
user_schema = {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {"phone": {"type": "string", "pattern": "^\\+?[0-9]{10,15}$"}},
    "required": ["phone"]
}

validated = JsonSchemaDraft202012(**user_schema)

总结一下

  • 只需要转JSON Schema为Pydantic模型?用Pydantic原生的from_json_schema()就够了,简单高效。
  • 需要验证用户提交的JSON Schema是否符合规范?要么手动生成Meta Schema模型,要么用json-schema-pydantic直接调用预定义模型。

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

火山引擎 最新活动