TypeError: Object of type Decimal is not JSON serializable
解读:在响应中包含了一个 Decimal
类型的对象,而 JSON 序列化器不知道如何处理这种类型。在 Python 中,Decimal
类型通常用于表示精确的小数,但它不是 JSON 序列化器的内置类型。
解决方案:使用 jsonable_encoder
来将 Decimal
转换为浮点数或字符串。
jsonable_encoder
是 FastAPI 提供的一个工具函数,它主要用于将各种复杂的数据类型转换为 JSON 可以序列化的格式。这对于将数据库模型、Pydantic 模型或其他一些复杂数据类型转换为可以被 FastAPI 直接返回的格式非常有用。
主要作用
-
转换复杂数据类型 :将日期、字节、UUID 等复杂类型转换为 JSON 兼容的类型(如字符串)。
-
处理嵌套模型 :支持嵌套的模型结构,可以递归地将复杂对象转换为基本数据类型。
-
简化开发 :避免了手动编写序列化逻辑,直接将模型或数据库查询结果转换为 JSON 格式,减少开发工作量。
典型用法
在接口函数中,使用 jsonable_encoder
对返回的数据进行转换,确保所有数据都能被正确序列化为 JSON:
from fastapi.encoders import jsonable_encoder
@router.get("/sales-order/list")
async def list_sales_orders(page: int = 1, page_size: int = 10):
sales_order_controller = SalesOrderController()
sales_orders, total = await sales_order_controller.list(page=page, page_size=page_size)
# 使用 jsonable_encoder 转换数据
return SuccessExtra(data=jsonable_encoder(sales_orders), total=total, page=page, page_size=page_size)
灵活性
jsonable_encoder
提供了参数以定制其行为,比如 exclude_none
、exclude_unset
、include
和 exclude
等,允许对序列化过程进行精细控制。
实际案例:
在接口函数中进行修改,增加一行,使用jsonable_encoder对data进行转换。
在返回数据之前,把data转换为json。