Python JSON:TypeError:Decimal(';34.3';)不可JSON序列化

Python JSON:TypeError:Decimal(';34.3';)不可JSON序列化,python,json,Python,Json,我正在运行一个返回小数列表的SQL查询。当我尝试将其转换为JSON时,我得到了类型错误 查询: res = db.execute(""" SELECT CAST ((SUM(r.SalesVolume)/1000.0) AS decimal(6,1)) FROM RawData r INNER JOIN Product p ON r.ProductId = p.ProductId INNER JOIN Calendar c ON r.DayId = c.DayId WHERE c.WeekCo

我正在运行一个返回小数列表的SQL查询。当我尝试将其转换为JSON时,我得到了类型错误

查询:

res = db.execute("""
SELECT CAST ((SUM(r.SalesVolume)/1000.0) AS decimal(6,1))
FROM RawData r
INNER JOIN Product p
ON r.ProductId = p.ProductId 
INNER JOIN Calendar c
ON r.DayId = c.DayId
WHERE c.WeekCodeInYear BETWEEN 1 AND 12
AND 
c.YearId = 2014
GROUP BY c.WeekCodeInYear """)
结果列表:

[Decimal('34.3'), Decimal('50.9'), Decimal('31.5'), Decimal('23.3'), Decimal('19
.7'), Decimal('56.9'), Decimal('43.8'), Decimal('35.2'), Decimal('29.2'), Decima
l('43.7'), Decimal('42.6'), Decimal('23.4')]
代码:

而我得到的
无法序列化错误
尝试在网上查找,没有太多帮助。
请注意,最终列表将作为图表的输入数据。

正如错误所述,
Decimal
类型无法直接序列化为JSON。考虑将
十进制
转换为
浮点数
,如果希望将其保留为数字,则可能会出现舍入错误。i、 e

for row in res:
    testlist.append(float(row[0]))
或者使用列表理解构建列表,这次我将转换为
str

testlist = [str(row[0]) for row in res]
后者是合适的表示形式,因为
Decimal
类型可以用
str
明确表示。您可以像这样获取原始值

from decimal import Decimal
jlist = json.dumps(testlist)  # don't use list as it's predefined type
new_list = json.loads(jlist)
new_dlist = [Decimal(s) for s in new_list]

新的\u dlist
应与原始的
模板列表相同

使用覆盖
默认值

import json
from decimal import Decimal

def default(obj):
    if isinstance(obj, Decimal):
        return str(obj)
    raise TypeError("Object of type '%s' is not JSON serializable" % type(obj).__name__)

json.dumps(testlist, default=default)
或者只需对
Decimal
对象执行
str

for row in res:
    testlist.append (str(row[0]))
json.dumps(testlist)

十进制对象
不可json序列化。向我们展示
print testlist
@LittleQ的执行结果上面的结果列表就是
testlist
的执行,明白你的意思了。顺便说一句,
list
是一种内置类型,最好不要将其用作变量名。如果输入值始终在1位小数内,则您将始终具有该精度。提取该回退将需要以正确的精度构造
十进制
。后者更简单。我发现扩展默认类型有点棘手,我发现有人的库以有组织的方式对更多类型进行扩展。我还想将我的存储为浮点,所以我将第6行更改为
float(obj)
。也像顶部链接的示例一样
SimpleJson
支持
十进制。
for row in res:
    testlist.append (str(row[0]))
json.dumps(testlist)