2012-06-11 66 views
4

我有(從http.server使用類)寫在Python3一個簡單的Web服務器我是從2移植到3Python3 json.dumps給出了類型錯誤:鍵必須是一個字符串

我有以下代碼:

# More code here... 
postvars = cgi.parse_qs(self.rfile.read(length), 
         keep_blank_values=1) 
something.json_run(json.dumps(postvars)) 

會拋出:

TypeError: keys must be a string 

通過檢查數據,我已經確定parse_qs似乎編碼鍵作爲字節,這是什麼扔ERR或者(json顯然不喜歡字節)。

import json 
json.dumps({b'Throws error' : [b"Keys must be a string"]}) 
json.dumps({'Also throws error': [b'TypeError, is not JSON serializable']}) 
json.dumps({'This works': ['No bytes!']}) 

這裏最好的解決方案是什麼?在Python 2中,代碼工作正常,因爲parse_qs使用str而不是bytes。我最初的想法是,我可能需要編寫一個JSON序列化程序。並不是說這對於簡單的事情來說很困難,但我不希望我能夠以其他方式做到這一點(例如,將字典翻譯爲使用字符串而不是字節)。

+1

python 2中的'str'實際上與'bytes'相同。 JSON庫在Python 3中變得更挑剔(有理由)。 –

+0

所以我正在發現...:P –

+1

另請參閱:http://bit.ly/unipain – Daenyth

回答

2

首先,cgi.parse_qs函數已被棄用,只是urllib.parse.parse_qs的別名,您可能需要調整導入路徑。

其次,你傳遞一個字節字符串到解析方法。如果你在一個正常(Unicode)的字符串傳遞而不是parse_qs方法返回的字符串規則:

>>> from urllib.parse import parse_qs 
>>> parse_qs(b'a_byte_string=foobar') 
{b'a_byte_string': [b'foobar']} 
>>> parse_qs('a_unicode_string=foobar') 
{'a_unicode_string': ['foobar']} 

因此,您需要將您的文件讀取字節的字符串解碼首先到正規的字符串。

相關問題