JSON:TypeError:Decimal(' 34.3')不是JSON可序列化的

时间:2015-07-03 09:13:29

标签: python json

我正在运行一个SQL查询,它返回一个Decimal列表。当我尝试将其转换为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')]

代码:

for row in res:
    testlist.append (row[0])
    print testlist

list = json.dumps(testlist)

我得到Unable to serialize error 尝试在线查找,没有多大帮助。 请注意,最终列表将作为输入数据输入图表。

2 个答案:

答案 0 :(得分:12)

使用覆盖default

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)

或者只在str对象上执行Decimal

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

答案 1 :(得分:4)

如错误所示,Decimal类型无法直接序列化为JSON。考虑将Decimal转换为float,如果您希望将其保留为数字,则可能会出现舍入错误。即。

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]

new_dlist应与原始templist相同。