2017-05-04 69 views
2

的順序。它被裝載方式如下:Python的json.loads改變我有一個包含JSON對象的文件對象

with open('data.json', 'r') as input_file: 
    input_data = input_file.read() 

此時input_data只包含一個字符串,現在我繼續把它解析成JSON:

data_content = json.loads(input_data.decode('utf-8')) 

data_content有這字符串的JSON表示我需要什麼,但出於某種原因json.loads它正在改變鍵的順序原始順序,因此,舉例來說,如果我的文件包含類似後我也不清楚:

{ "z_id": 312312, 
    "fname": "test", 
    "program": "none", 
    "org": null 
} 

json.loads後的順序被改變,以讓我們這樣說:

{ "fname": "test", 
    "program": None, 
    "z_id": 312312, 
    "org": "none" 
} 

這究竟是爲什麼?有沒有辦法維護訂單?我正在使用Python 2.7。

+2

爲什麼你需要字典順序? –

+1

如果你確實需要的命令,那麼http://stackoverflow.com/questions/6921699/can-i-get-json-to-load-into-an-ordereddict-in-python – tdelaney

+0

我認爲這是一個壞榜樣,因爲鑰匙按字母順序排列。我將編輯示例。我的意思是我想要的對象沒有改變,但持有什麼順序它最初曾 – Sebastian

回答

8

詞典(對象)在python沒有保證的順序。所以當解析成dict時,訂單就會丟失。

如果訂單因某種原因很重要,您可以讓json.loads改爲使用OrderedDict,這與dict類似,但是保存了按鍵的順序。

from collections import OrderedDict 

data_content = json.loads(input_data.decode('utf-8'), object_pairs_hook=OrderedDict) 
+0

是的,這解決了這個問題。非常感謝先生! – Sebastian

+1

哇!經過一整天的調試,這對我有效。下午我可以給你買冰淇淋。 – kevthanewversi

4

這不是json.load的問題。 Python中的字典不是強制執行的,所以你會把它搞亂。一般來說,這並不重要,因爲您訪問基於字符串的元素,如"id"

+0

這非常重要在這種情況下,因爲我必須將數據轉儲到excel文件中並需要保留結構。我的所有文件將不會有相同的結構,因此無法單獨訪問每個元素 – Sebastian