2014-04-07 18 views
1

的Python 2.7.6的代碼我使用:意外輸出當保存/載入字典/從Windows 7 JSON

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

你沒有做錯什麼;這是您應該期待的確切輸出。

JSON專門處理Unicode字符串; u''字符串就是這樣的Unicode值。如果所有的字符串都包含ASCII範圍內的字符,那麼在處理這些字符時就不會注意到任何差異。換句話說,使用混合常規(字節)字符串與這些值將工作,Python將透明地編碼和解碼兩種類型之間。當文本包含超出ASCII範圍的字符時,您只會注意到問題。例如,請考慮重音字符,符號或亞洲腳本。在這種情況下,您應該學習如何正確使用Unicode,請參閱Python Unicode HOWTO

+0

謝謝,我沒有檢查我是否可以使用它們。對於我來說,我只是停留在奇怪的輸出 – user3506067

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不強制統一。或者你可以編寫一個轉換器函數並將其掛接到json.load-函數中作爲object_hook參數。

這裏的object_hook,例如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')