如何用Pydantic创建含固定值的Schema并验证特定JSON结构
解决方案
核心思路
要满足你的两个强制验证需求,需要利用Pydantic的固定值约束和严格类型验证特性:
- 对
columns字段,强制其必须等于固定列表["x", "y", "z"] - 对
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])
以上情况都会被拦截并返回验证错误
- 子列表长度不是3(如
可选调整
如果允许第三个元素接受整数(自动转为浮点数),可以去掉Strict前缀,改用普通的int和float:
data: list[tuple[int, int, Optional[float]]]
内容的提问来源于stack exchange,提问作者KrawallKurt
相关产品推荐
相关产品推荐

