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

调用Pydantic模型的dict方法与使用jsonable_encoder的差异

Pydantic dict() 方法与 FastAPI jsonable_encoder 的区别

当你在FastAPI中需要将Pydantic模型传入JSONResponse时,调用模型的dict()方法和使用jsonable_encoder()函数存在以下核心区别:

  • 非JSON原生类型的自动处理
    jsonable_encoder会把Python中无法直接序列化为JSON的类型(比如datetime、UUID、Decimal)自动转成JSON兼容格式——比如把datetime转为ISO标准字符串。而dict()只是把Pydantic模型转成普通字典,不会处理这些特殊类型,直接传给JSONResponse会触发序列化错误。

    示例代码:

    from datetime import datetime
    from pydantic import BaseModel
    from fastapi.encoders import jsonable_encoder
    
    class Student(BaseModel):
        name: str
        id: str
        enroll_time: datetime
    
    s = Student(id="1", name="Alice", enroll_time=datetime.now())
    
    # dict()返回的字典中,enroll_time仍是datetime对象
    print(s.dict()["enroll_time"])
    # jsonable_encoder返回的字典中,enroll_time已转为ISO字符串
    print(jsonable_encoder(s)["enroll_time"])
    
  • 嵌套结构的递归处理
    对于包含嵌套Pydantic模型的复杂结构,jsonable_encoder会递归遍历所有层级,确保每个特殊类型都被正确转换。dict()虽然也能将嵌套模型转为字典,但不会处理嵌套结构里的特殊类型,可能导致深层字段序列化失败。

  • FastAPI生态的兼容性
    jsonable_encoder是FastAPI为自身生态定制的工具,和框架的请求解析、依赖注入逻辑对齐,还能直接处理ORM模型(只要Pydantic模型开启了orm_mode),不用手动做转换。而dict()只针对Pydantic模型本身,无法直接处理ORM实例。

  • 序列化配置的细节差异
    两者都支持include、exclude参数筛选字段,但jsonable_encoder额外适配了API响应的需求——比如自动处理可选字段的默认值、空值的序列化逻辑,更符合HTTP响应的JSON格式规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 09:20:20