如何使用Pydantic验证复杂嵌套的二维字典数据结构?
实现方案
Pydantic本身完全支持键为整数类型的字典校验,你所说的「要求所有数据字段都是字符串类型」是误解,以下是完整实现代码:
Pydantic v2 实现(当前主流版本)
1. 定义校验模型
from pydantic import BaseModel, RootModel, ValidationError, StrictInt # 定义最内层数据结构 class InnerItem(BaseModel): S: str # 用StrictInt开启严格类型校验,禁止字符串转数字的自动类型转换 T: StrictInt V: StrictInt # 定义完整二维字典结构:外层两层键均为严格整数类型,值为内层结构 TwoDimDict = RootModel[dict[StrictInt, dict[StrictInt, InnerItem]]]
2. 校验使用示例
合法数据校验
valid_data = { 0: { 0: {'S': 'str1', 'T': 4, 'V': 0x3ff}, 1: {'S': 'str2', 'T': 5, 'V': 0x2ff} }, 1: { 0: {'S': 'str3', 'T': 8, 'V': 0x1ff}, 1: {'S': 'str4', 'T': 7, 'V': 0x0ff} } } try: validated_data = TwoDimDict.model_validate(valid_data) print("数据校验通过") except ValidationError as e: print("数据校验失败:\n", e)
非法场景校验测试
- 外层键为字符串类型的错误触发
invalid_key_data = { "0": { 0: {'S': 'str1', 'T': 4, 'V': 0x3ff} } } try: TwoDimDict.model_validate(invalid_key_data) except ValidationError as e: print("外层键类型错误:\n", e)
- 内层V字段为字符串的错误触发
invalid_field_data = { 0: { 0: {'S': 'str1', 'T': 4, 'V': "0x3ff"} } } try: TwoDimDict.model_validate(invalid_field_data) except ValidationError as e: print("V字段类型错误:\n", e)
Pydantic v1 兼容实现
如果使用的是Pydantic v1版本,仅需要对模型定义和校验方法做少量修改:
from pydantic import BaseModel, ValidationError, StrictInt from typing import Dict class InnerItem(BaseModel): S: str T: StrictInt V: StrictInt class TwoDimDict(BaseModel): __root__: Dict[StrictInt, Dict[StrictInt, InnerItem]] # 校验调用方法替换为parse_obj validated_data = TwoDimDict.parse_obj(valid_data)
内容的提问来源于stack exchange,提问作者Dave Hwang
相关产品推荐
相关产品推荐

