2012-12-31 55 views
0

在Python的STL使用JSON播放和想出了這個..如何JSON確定寫入/輸出順序

import json as j 

cred = j.dumps({'Name': 'John Doe', 'Occupation': 'Programmer'}, 
      sort_keys = True, 
      indent = 4, 
      separators = (',', ': ')) 

_f = open('credentials', 'w') 
_f.write(cred) 
_f.close() 

輸出低於所有的罰款..

{

"Name": "John Doe", 
    "Occupation": "Programmer" 

}

然而,我不小心在小寫輸入名稱這樣的..

cred = j.dumps({'name': 'John Doe', 'Occupation': 'Programmer'}, 
      sort_keys = True, 
      indent = 4, 
      separators = (',', ': ')) 

,結果是這樣的..

{

"Occupation": "Programmer", 
    "name": "John Doe" 

}


json如何確定傳遞給它的值的寫入/輸出順序,大寫字母的優先級大於小寫字母還是反之亦然,並且有沒有辦法保存順序?

+0

我沒有看過源代碼,但我假設它根據ASCII碼進行排序。 [鏈接。](http://www.asciitable.com/index/asciifull.gif)你會注意到O是79,但是n是110. –

+0

這是一個無效的假設。該命令基於散列函數,它是與隨機數生成相關的函數。它基本上是隨機的。 – Keith

+0

@凱斯廢話。散列表中的順序是非確定性的。這幾乎,但不完全不像隨機順序。儘管最近的CPython版本實際上增加了一些「隨機化」,除非明確禁用(爲了防範DOS類攻擊),但這並不能使這兩個概念相關。這與RNGs有什麼關係?沒有我知道的散列函數與這些有關。 – delnan

回答

3

Python字典以及JSON對象沒有訂單。您可能看到的任何訂單都是隨意的,並且可能隨時更改。如果您想以JSON格式存儲訂單,則需要使用數組而不是對象。

sort_keys似乎保證某種輸出順序,但這可能只是爲了使它對人類更具可讀性。閱讀JSON的計算機不應該關心字段順序。

+0

相關的,如果你想在不使用json的時候保留字典的順序,你應該使用['collections.OrderedDict'](http://docs.python.org/2/library/collections.html#collections.OrderedDict)。 – Natan