2013-03-26 77 views
0

我有以下代碼:JSON序列錯誤與simplejson

data = {'services': [u'iTunes'], 
     'orders': [u'TestOrder', u'Test_April_Titles_iTunes'], 
     'providers': ''} 

return HttpResponse(simplejson.dumps(data)) 

File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py" in default 
    178.   raise TypeError(repr(o) + " is not JSON serializable") 

Exception Type: TypeError at /reports/change_dropdown/ 
Exception Value: [u'iTunes'] is not JSON serializable 

什麼我需要做的序列化此字典裏面坐了一個列表?

+2

你正在使用什麼版本的'simplejson'?我很確定這個Unicode支持是很久以前加入的。更重要的是,爲什麼在2.7中使用'simplejson'而不是內置於stdlib,'json'的版本? – abarnert 2013-03-26 21:16:42

+0

[SSCCE](http://SSCCE.org)。 – 2013-03-26 21:19:32

回答

1

的問題是,itunes是一種非JSON兼容型。

爲了解決提供默認類型轉換非JSON兼容的類型序列化時:

simplejson.dumps(data, default=str)) 

甚至:

def handler(val): 
    if isinstance(val, unicode) 
     return str(val) 
    else: 
     return val 

simplejson.dumps(data, default=handler)) 

第二個選項,你可以處理組的優勢(例如,轉換爲列表),日期(例如,轉換爲int timetstamp)等。

0

unicode轉換爲str在這裏工作:

data['services'] = [str(item) for item in data['services']] 
data['orders'] = [str(item) for item in data['orders']] 
data['providers'] = [str(item) for item in data['providers']] 
+1

JSON處理unicode就好了。我認爲你的類型不是unicode;也許他們是BeautifulSoup NavigableText實例呢?嘗試將它們轉換爲*'unicode()'*來代替。下次您肯定希望檢查它們的type()。 – 2013-03-26 21:16:28

+0

即使您使用的是不處理Unicode的格式(或庫),如果您有任何非ASCII字符串,您也不希望只將「unicode」轉換爲「str」。如果你知道字符集是什麼,使用'item.encode('UTF-8')'(或其他)。如果你不知道字符集是什麼......你可能想使用''unicodeescape'',所以你可以通過一個8位的管道將其集中,並在另一端恢復它。 – abarnert 2013-03-26 21:20:38