2016-11-03 68 views
1

当使用json.dumpsensure_ascii默认为True但我看到自己不断地将它设置为False为:与ensure_ascii使用json.dumps =真

  • 如果我unicode工作,我需要通过它还是我会得到str的回
  • 如果我str工作,我需要通过它,所以我的字符不被转换为Unicode(一STR内编码)

在这情况下,您会婉它是True?该选项的用途是什么?

从文档:

如果ensure_ascii为真(缺省值),输出中的所有非ASCII字符都逃脱了与为\ uXXXX序列,其结果是只由ASCII字符STR实例。

它有什么好处?

+0

“如果我使用unicode,我需要通过它,否则我会恢复” - 无论如何,您可能会收到一个“str”。 'ensure_ascii = False'不保证结果的类型是'unicode'。 – user2357112

+0

“如果我与str一起工作,我需要传递它,以便我的字符不会转换为unicode(在str中编码)” - 您打开允许“unicode”返回值的选项,希望它会*防止*你获得Unicode输出?你确定你明白这件事吗? – user2357112

+0

>>>我假设“返回值可能是unicode实例”意思是如果你通过我unicode我给你unicode,但它可能会不是那样。有什么传递和期望的明确指导? –

回答

3

写了感谢@ user2357112

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

然后检查:

这使我认为:

  • 当你编码文本转换成JSON和您的所有字符串Unicode中它是好的使用ensure_ascii=False,但它实际上可能更有意义,它留给真实并解码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解码器解析ERS。

而且如果混合类型(统一的阵列和STR),并使用ensure_ascii=False你可以得到一个UnicodeDecodeErrror(当编码成JSON,mindblending)作为模块将返回你一个Unicode对象,但它不会是能够转换使用默认编码(ascii)将其转换为unicode