首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UnicodeDecodeError in json.dump

UnicodeDecodeError in json.dump
EN

Stack Overflow用户
提问于 2014-02-11 05:19:12
回答 1查看 2.2K关注 0票数 1

我有一个复杂的JSON可序列化的数据结构,其中包含了unicode字符串和utf-8字节字符串。

当我尝试使用ensure_ascii=False序列化该结构时,它会失败:

代码语言:javascript
复制
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?

EN

回答 1

Stack Overflow用户

发布于 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

对我来说,理解编码和避免问题的一般规则如下:

  1. 代码中的字符串必须是unicode。
  2. 导入数据时,将其解码为unicode。出口时,ENCODE。这需要两个部分都同意他们正在使用的编码,否则你只会得到噪音。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21693754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档