将字典保存到/从json加载时出现意外输出

时间:2014-04-07 09:37:15

标签: python json

Windows 7上的Python 2.7.6 我使用的代码:

import json

settings = {
    "vo" : "direct3d",
    "ao" : "dsound",
    "volume" : "100",
    "priority" : "abovenormal"}

json.dump(settings, open('settings.json', 'w'))
settings = json.load(open('settings.json', 'r'))

print settings

在settings.json中,我得到:

{"volume": "100", "priority": "abovenormal", "ao": "dsound", "vo": "direct3d"}

在终端控制台输出:

{u'volume': u'100', u'priority': u'abovenormal', u'ao': u'dsound', u'vo': u'direct3d'}

我做错了什么?

2 个答案:

答案 0 :(得分:1)

你没有做错任何事。 json.load会将所有内容转换为unicode,这就是u代表的内容。

这不应该影响该词典的使用,例如:

>>> result = {u'volume': u'100', u'priority': u'abovenormal', u'ao': u'dsound',
u'vo': u'direct3d'}
>>> result['volume']
u'100'

如果结果是一个问题,你总是可以使用simplejson来强制unicode。或者您可以编写转换器函数并将其挂钩到json.load - 函数作为object_hook参数。

这里是object_hook-example from the docs

>>> import json
>>> def as_complex(dct):
...     if '__complex__' in dct:
...         return complex(dct['real'], dct['imag'])
...     return dct
...
>>> json.loads('{"__complex__": true, "real": 1, "imag": 2}',
...     object_hook=as_complex)
(1+2j)
>>> import decimal
>>> json.loads('1.1', parse_float=decimal.Decimal)
Decimal('1.1')

答案 1 :(得分:0)

你没有做错任何事;这是你应该期待的确切输出。

JSON专门处理Unicode字符串; u''字符串是这样的Unicode值。如果所有字符串都包含ASCII范围内的字符,那么在处理这些字符时你不会发现任何差异。

换句话说,使用混合常规(字节)字符串与这些值将起作用,Python将透明地编码和解码这两种类型。当文本包含超出ASCII范围的字符时,您只会注意到问题。例如,可以考虑重音字符,符号或亚洲脚本。在这种情况下,您应该学习如何正确使用Unicode,请参阅Python Unicode HOWTO