我正在运行一个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)
或者只是做str的Decimal目的:
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。
| 归档时间: |
|
| 查看次数: |
21208 次 |
| 最近记录: |