我有一个复杂的JSON可序列化的数据结构,其中包含了unicode字符串和utf-8字节字符串。
当我尝试使用ensure_ascii=False序列化该结构时,它会失败:
Python 2.7.5+ (default, Sep 19 2013, 13:48:49)
[GCC 4.8.1] on linux2
>>> import json
>>> json.dumps(['\xd0\xb2', u'\xd0\xb2'], ensure_ascii=False)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/json/__init__.py", line 250, in dumps
sort_keys=sort_keys, **kw).encode(obj)
File "/usr/lib/python2.7/json/encoder.py", line 210, in encode
return ''.join(chunks)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 1: ordinal not in range(128)
>>> 我理解为什么是this happens,但是否有一种更简单或内置的方式来使其工作,而不是递归地迭代数据结构,查找字节字符串并将它们解码为unicode?
发布于 2014-02-11 07:48:51
AFAIK序列化为JSON格式的原因是为了存储或传输一些信息。如果指定ensure_ascii = False,则不对非ascii字符进行编码,这完全没有意义,因为您希望对数据进行编码和序列化。
基本上,您正在尝试获得一个具有非编码字符的字符串,这是不可能的。
来自官方文件:
如果ensure_ascii为True (默认值),则输出中的所有非ASCII字符都将使用\uXXXX序列进行转义,其结果是一个仅由ASCII字符组成的str实例。如果ensure_ascii为False,则写入fp的某些块可能是unicode实例。这通常是因为输入包含unicode字符串或使用编码参数。除非fp.write()显式地理解unicode (如在codecs.getwriter()中),否则很可能会导致错误。
另一方面,您正在设计API这一事实并不表明您对输入没有控制。API在某种程度上是一种契约:如果给定了一些输入,则返回一些输出。因此,您可以并且应该始终指定您所期望的内容。
在您的示例中,您可以逐个检查元素,并将字节字符串转换为unicode。尽管如此,我的建议是您强制用户使用unicode和不指定 ensure_ascii = False
对我来说,理解编码和避免问题的一般规则如下:
https://stackoverflow.com/questions/21693754
复制相似问题