我正在运行一个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
尝试在线查找,没有多大帮助。
请注意,最终列表将作为输入数据输入图表。
答案 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
相同。