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

从MySQL到Python Flask获取浮点值遇Decimal序列化错误求助

嗨,这个Decimal类型无法JSON序列化的问题我太熟了!其实就是Python的JSON模块不认Decimal这个特殊类型,咱们可以用这几个办法轻松解决:

方法1:自定义JSON编码器(最灵活)

自己写个编码器告诉JSON模块怎么处理Decimal,还能灵活控制是转成字符串(避免精度丢失)还是浮点数:

import json
from decimal import Decimal

class DecimalEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, Decimal):
            # 推荐转字符串,避免浮点精度丢失问题
            return str(obj)
            # 如果不在意精度也可以转成float:return float(obj)
        # 其他类型交给默认逻辑处理
        return super().default(obj)

# 假设你的数据库查询结果存在data变量里
data = {"total_amount": Decimal("29.97"), "item_count": Decimal("3")}

# 序列化时指定咱们的编码器就行
json_result = json.dumps(data, cls=DecimalEncoder)

如果是用Django/Flask这类Web框架返回响应,直接把编码器传给响应类即可,比如Django的JsonResponse(data, encoder=DecimalEncoder)。

方法2:SQL查询时直接转换类型

不想改Python代码的话,在MySQL查询语句里直接把Decimal列转成字符串或整数:

SELECT 
    order_id,
    user_id,
    CAST(total_price AS CHAR) AS total_price,  -- 转成字符串
    CAST(quantity AS UNSIGNED) AS quantity     -- 转成整数(适用于整数型的Decimal列)
FROM orders;

这样查出来的结果直接是字符串/整数,JSON序列化完全不会出问题。

方法3:用第三方库simplejson

这个库默认就支持Decimal序列化,省得自己写编码器:
先安装依赖:

pip install simplejson

然后直接使用:

import simplejson as json
from decimal import Decimal

data = {"price": Decimal("15.50")}
json_result = json.dumps(data)  # 直接搞定,无需额外处理

核心原因就是JSON原生类型里没有Decimal,Python标准库的json模块只认识基础类型,所以得给它指条明路~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:06:09