从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
相关产品推荐
相关产品推荐

