Way*_*ner 5 python json python-3.x
我有一个用Python3编写的简单Web服务器(使用类http.server),我将从2移植到3.
我有以下代码:
# More code here...
postvars = cgi.parse_qs(self.rfile.read(length),
keep_blank_values=1)
something.json_run(json.dumps(postvars))
Run Code Online (Sandbox Code Playgroud)
哪个投掷:
TypeError: keys must be a string
Run Code Online (Sandbox Code Playgroud)
通过检查数据,我已经确定parse_qs似乎将密钥编码为字节,这就是抛出错误(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!']})
Run Code Online (Sandbox Code Playgroud)
这里最好的解决方案是什么?使用Python 2,代码工作正常,因为parse_qs使用str而不是bytes.我最初的想法是我可能需要编写一个JSON序列化程序.并不是说这么简单的事情很困难,但我不愿意,如果我能用其他方式做到这一点(例如将字典翻译为使用字符串而不是字节).
首先,该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']}
Run Code Online (Sandbox Code Playgroud)
因此,您需要首先将文件读取的字节字符串解码为常规字符串。
| 归档时间: |
|
| 查看次数: |
2857 次 |
| 最近记录: |