使用json.dumps和ensure_ascii = True

Mar*_*ero 7 python unicode json python-2.7

当使用json.dumps默认为ensure_asciiTrue,但我看到自己不断地将它设置为False如下:

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

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

来自Docs:

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

它有什么好处?

Mar*_*ero 9

感谢@ 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"' |
+-----------------------+--------------+------------------------------+
Run Code Online (Sandbox Code Playgroud)

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

此外,如果你混合类型(unicode和str的数组)和使用ensure_ascii=False你可以得到一个UnicodeDecodeErrror(当编码到json,mindblending),因为模块将返回一个unicode对象,但它不能使用默认值将str转换为unicode编码(ascii)