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

如何用Pydantic创建含固定值的Schema并验证特定JSON结构

解决方案

核心思路

要满足你的两个强制验证需求,需要利用Pydantic的固定值约束和严格类型验证特性:

  1. 对columns字段,强制其必须等于固定列表["x", "y", "z"]
  2. 对data字段,严格约束每个子列表的元素类型、顺序和长度:前两个必须是整数,第三个可以是浮点数或null(对应Python的None)

基于Pydantic v2的实现

Pydantic v2支持直接用Literal约束列表的固定值,同时StrictInt/StrictFloat可以实现严格类型校验(避免自动类型转换)。

from fastapi import FastAPI
from pydantic import BaseModel, Literal, StrictInt, StrictFloat, Optional

app = FastAPI()

class DataFrameJSON(BaseModel):
    # 强制columns必须严格等于["x", "y", "z"]
    columns: Literal[["x", "y", "z"]]
    # 每个数据行必须是(严格整数, 严格整数, 可选严格浮点数)的结构,子列表长度固定为3
    data: list[tuple[StrictInt, StrictInt, Optional[StrictFloat]]]

@app.post("/submit-data/")
async def submit_data(payload: DataFrameJSON):
    # 这里写你的业务逻辑
    return {"status": "success", "received_data": payload.dict()}

基于Pydantic v1的实现

如果使用Pydantic v1,Literal不支持直接约束列表值,需要用自定义验证器来校验columns:

from fastapi import FastAPI
from pydantic import BaseModel, validator, StrictInt, StrictFloat, Optional

app = FastAPI()

class DataFrameJSON(BaseModel):
    columns: list[str]
    data: list[tuple[StrictInt, StrictInt, Optional[StrictFloat]]]

    @validator("columns")
    def validate_columns(cls, value):
        if value != ["x", "y", "z"]:
            raise ValueError("columns must be exactly ['x', 'y', 'z']")
        return value

@app.post("/submit-data/")
async def submit_data(payload: DataFrameJSON):
    return {"status": "success", "received_data": payload.dict()}

验证效果说明

  • 不合法的columns:比如["x","x","x"]或["x","y"],会直接触发Pydantic验证错误
  • 不合法的data:
    • 子列表长度不是3(如[0,0])
    • 前两个元素不是整数(如[1.0, 0, 0.5])
    • 第三个元素是整数而非浮点数/null(如[0,0,0])
      以上情况都会被拦截并返回验证错误

可选调整

如果允许第三个元素接受整数(自动转为浮点数),可以去掉Strict前缀,改用普通的int和float:

data: list[tuple[int, int, Optional[float]]]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 12:10:17