使用json.dumps和ensure_ascii = True

时间:2016-11-03 23:06:53

标签: python json python-2.7 unicode

使用json.dumpsensure_ascii的默认值为True,但我发现自己不断将其设置为False

  • 如果我与unicode合作,我需要通过它,否则我会回来
  • 如果我使用str我需要通过它,这样我的字符就不会转换为unicode(在str中编码)

您希望在哪种情况下True?该选项的用例是什么?

来自文档:

  

如果ensure_ascii为true(默认值),则输出中的所有非ASCII字符都使用\ uXXXX序列进行转义,结果是仅包含ASCII字符的str实例。

它有什么好处?

1 个答案:

答案 0 :(得分:8)

感谢@ user2357112

首先要了解JSON中没有二进制表示。因此,所有字符串都应该是有效的unicode点。如果你正在尝试json.dumps原始字节,你可能会做错事。

然后检查:

这让我认为:

  • 当您将文本编码为json并且所有字符串都使用unicode时,可以使用ensure_ascii=False,但实际上将其保留为true并解码str可能更有意义。 (根据规范转储不能保证unicode返回,但如果你传递unicode它会返回它。
  • 如果您正在使用str对象,则调用ensure_ascii = False将阻止json将您的字符转换为unicode。您可能认为自己想要这样,但如果您尝试在浏览器中阅读这些内容,例如可能会发生奇怪的事情

关于ensure_ascii如何影响结果,这是一个可能有用的表。

+-----------------------+--------------+------------------------------+
|         Input         | Ensure_ascii |            output            |
+-----------------------+--------------+------------------------------+
| u”汉语”                | True         | '"\\u6c49\\u8bed"'           |
| u”汉语”                | False        | u'"\u6c49\u8bed"'            |
| u”汉语".encode("utf-8")| True         | '"\\u6c49\\u8bed"’           |
| u”汉语".encode("utf-8")| False        | '"\xe6\xb1\x89\xe8\xaf\xad"' |
+-----------------------+--------------+------------------------------+

注意最后一个值是utf-8编码的unicode到字节。其他json解码器可能无法解析。

此外,如果混合类型(unicode和str的数组)并使用ensure_ascii=False,你可以获得一个UnicodeDecodeErrror(当编码为json时,思考混合),因为模块将返回一个unicode对象但是它无法使用默认编码(ascii)将str转换为unicode