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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 02:24:03