2015-07-03 29 views
2

我正在運行一個SQL查詢,它返回一個小數列表。當我嘗試將其轉換爲JSON時,我得到了類型錯誤。JSON:TypeError:十進制('34 .3')不是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

'小數object'不JSON序列化。向我們展示'print testlist'的執行結果 – LittleQ

+0

@LittleQ上面的結果列表是'testlist'的執行結果。 –

+0

明白了你的觀點。順便說一句,'list'是一個內置類型,最好不要用它作爲變量名稱。 – LittleQ

回答

2

由於錯誤提示,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原始值。

+0

如果輸入已經在1位十進制數字之內_always_那麼你總是會有這個精度。提取出來需要用正確的精度構造'Decimal'。 – metatoaster

9

使用覆蓋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) 

或者只是做strDecimal對象:

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

後者更簡單。 – LittleQ