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'}
我做错了什么?
答案 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。