JSON:TypeError:Decimal('34 .3')不是JSON可序列化的

Tau*_*ain 6 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 """)
Run Code Online (Sandbox Code Playgroud)

结果清单:

[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')]
Run Code Online (Sandbox Code Playgroud)

码:

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

list = json.dumps(testlist)
Run Code Online (Sandbox Code Playgroud)

而且我在Unable to serialize error 网上查找了Tried,没有多大帮助.请注意,最终列表将作为输入数据输入图表.

Lit*_*leQ 14

使用覆盖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)
Run Code Online (Sandbox Code Playgroud)

或者只是做strDecimal目的:

for row in res:
    testlist.append (str(row[0]))
json.dumps(testlist)
Run Code Online (Sandbox Code Playgroud)


met*_*ter 10

正如错误所说,该Decimal类型无法直接序列化为 JSON。如果您希望将其保留为数字,请考虑将其Decimal转换float为 a,但是您可能会遇到舍入错误。IE

for row in res:
    testlist.append(float(row[0]))
Run Code Online (Sandbox Code Playgroud)

或者使用列表理解构建列表,这次我转换为str.

testlist = [str(row[0]) for row in res]
Run Code Online (Sandbox Code Playgroud)

后者是一种适当的表示,因为该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]
Run Code Online (Sandbox Code Playgroud)

new_dlist应该和原来的一样templist