Python3json.dumps文件提供TypeError:键必须是字符串

2024-09-27 07:21:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个用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))

会引发:

^{pr2}$

通过检查数据,我确定了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!']})

最好的解决办法是什么?对于Python2,代码工作得很好,因为parse_qs使用了str,而不是{}。我最初的想法是,我可能需要编写一个JSON序列化程序。并不是说这么简单的东西很难,但如果我能用其他方法来做(例如,把字典翻译成使用字符串而不是字节),我宁愿不这么做。在


Tags: 代码服务器webjsonhttp字节serverparse
1条回答
网友
1楼 · 发布于 2024-09-27 07:21:20

首先,cgi.parse_qs函数不推荐使用,它只是urllib.parse.parse_qs的别名,您可能需要调整导入路径。在

其次,将一个字节字符串传入parse方法。如果传入常规(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']}

因此,您需要先将文件读取字节字符串解码为常规字符串。在

相关问题 更多 >

    热门问题