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

如何将Pydantic与PyMongo集成?解决字典转JSON校验问题

解决方案

问题根源

Pydantic的Json类型专门用于校验JSON格式的字符串、字节或字节数组,它会将这类输入解析为Python对象。但PyMongo从MongoDB读取数据时,已经自动把BSON解析成了Python字典,直接传入Json类型自然会因类型不匹配报错。

方法一:替换Json类型为字典/任意类型(推荐)

既然已经拿到了解析后的字典,完全不需要用Json类型,直接用dict或Any来定义字段即可,Pydantic会自动处理这类结构:

from pydantic import TypeAdapter, BaseModel
from typing import Dict, Any

# contents是MongoDB集合
content = list(contents.find(projection={'_id': 0}))

class Content(BaseModel):
    # 如果content的结构有明确键值类型,可替换为具体的Dict[KeyType, ValueType]
    content: Dict[str, Any]
    # 若结构完全不确定,也可以直接用 content: Any

print(TypeAdapter(list[Content]).validate_python(content))

方法二:自定义字段验证器自动转换字典为JSON字符串

如果一定要保留Json类型,可以通过字段验证器在校验前自动将字典转为JSON字符串,无需手动遍历:

from pydantic import TypeAdapter, BaseModel, Json, field_validator
import json

# contents是MongoDB集合
content = list(contents.find(projection={'_id': 0}))

class Content(BaseModel):
    content: Json

    @field_validator('content', mode='before')
    def convert_dict_to_json(cls, value):
        if isinstance(value, dict):
            return json.dumps(value)
        return value

print(TypeAdapter(list[Content]).validate_python(content))

注意:这种方式会把字典转成JSON字符串存储在模型实例中,后续若要使用字典结构还需解析,不如方法一直接高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 02:33:17