TypeError: Object of type Decimal is not JSON serializable

TypeError: Object of type Decimal is not JSON serializable

解读:在响应中包含了一个 Decimal 类型的对象,而 JSON 序列化器不知道如何处理这种类型。在 Python 中,Decimal 类型通常用于表示精确的小数,但它不是 JSON 序列化器的内置类型。

解决方案:使用 jsonable_encoder 来将 Decimal 转换为浮点数或字符串。

jsonable_encoder 是 FastAPI 提供的一个工具函数,它主要用于将各种复杂的数据类型转换为 JSON 可以序列化的格式。这对于将数据库模型、Pydantic 模型或其他一些复杂数据类型转换为可以被 FastAPI 直接返回的格式非常有用。

主要作用

  1. 转换复杂数据类型 :将日期、字节、UUID 等复杂类型转换为 JSON 兼容的类型(如字符串)。

  2. 处理嵌套模型 :支持嵌套的模型结构,可以递归地将复杂对象转换为基本数据类型。

  3. 简化开发 :避免了手动编写序列化逻辑,直接将模型或数据库查询结果转换为 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_noneexclude_unsetincludeexclude 等,允许对序列化过程进行精细控制。

实际案例:

在接口函数中进行修改,增加一行,使用jsonable_encoder对data进行转换。在返回数据之前,把data转换为json。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值