python - json.dumps(pickle.dumps(u'å')) 引发 UnicodeDecodeError

标签 python json pickle

这是一个错误吗?

>>> import json
>>> import cPickle
>>> json.dumps(cPickle.dumps(u'å'))
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/json/__init__.py", line 230, in dumps
    return _default_encoder.encode(obj)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/json/encoder.py", line 361, in encode
    return encode_basestring_ascii(o)
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 1-3: invalid data

最佳答案

json 模块需要字符串来编码文本。 pickle 数据不是文本,而是 8 位二进制。

如果您真的需要通过 JSON 发送 pickled 数据,一个简单的解决方法是使用 base64:

j = json.dumps(base64.b64encode(cPickle.dumps(u'å')))
cPickle.loads(base64.b64decode(json.loads(j)))

请注意,这显然是一个 Python 错误。协议(protocol)版本 0 明确记录为 ASCII,但 å 作为非 ASCII 字节 \xe5 发送,而不是将其编码为 "\u00E5"。这个错误是在上游报告的——并且在没有修复错误的情况下关闭了票证。 http://bugs.python.org/issue2980

关于python - json.dumps(pickle.dumps(u'å')) 引发 UnicodeDecodeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3895036/

相关文章:

python - 我怎样才能加快网络应用程序的速度? (避免重建结构。)

python - 如何在 Python 中制作一个以逗号结尾的列表?

python - 有效区分元组中不同可能的组合

java - Android JSON 名称顺序

java - 如何在 Gson 中反序列化具有两种可能类型( boolean 值和字符串)的字段

python 3.x 从pickle恢复变量

python - 正则表达式:如何匹配相同字符的序列?

python - Discord.py 从 DM 获取消息

c# - 解析 json 并获取 null 异常,无论我做了多少次 null 检查

python - 如何在不处于顶层的情况下解决python多处理的 pickle 错误?