2015-05-04 19 views
1

我想傾倒此JSON到一個文件:python json dump,如何使第一個指定鍵?

json.dumps(data) 

這是數據:

{ 
     "list":[ 
     "one": { "id": "12","desc":"its 12","name":"pop"}, 
     "two": {"id": "13","desc":"its 13","name":"kindle"} 
     ] 
    } 

我想id成爲第一個財產後,我轉儲到文件,但它不是。我怎樣才能解決這個問題?

+0

請告訴我們你的代碼傾倒這個JSON到一個文件 – TerryA

回答

2

我的猜測是,這是因爲你正在使用字典(散列圖)。它是不可取的。 你可以做的是:

from collections import OrderedDict 
data = OrderedDict() 
data['list'] = OrderedDict() 
data['list']['one'] = OrderedDict() 
data['list']['one']['id'] = '12' 
data['list']['one']['idesc'] = ... 
data['list']['two'] = ... 

這使得通過輸入的順序進行排序。 因爲傳統字典的性質(和速度)使得排序/訪問順序根據用法,字典中的項目以及許多其他因素而變化,所以知道字典/散列表的輸出是「不可能的」。 因此,您需要將您的字典在發送給json之前傳遞給sort()函數,或者使用較低版本的字典OrderedDict(請參見上文)。

非常感謝@MarcoNawijn檢查JSON的來源,不尊重字典的排序結構,這意味着您必須自己構建JSON字符串。

如果您的JSON字符串另一端的解析器支持您的命令(我懷疑),您可以將它傳遞給一個函數,該函數將生成OrderedDict的常規文本字符串表示形式並根據JSON標準格式化字符串。然而,這會比現在佔用更多的時間,因爲我並不是100%確定JSON字符串的RFC。

+0

這是行不通的。 'json.dump(..)'不考慮添加鍵/值對的順序。您可以在交互式翻譯器中輕鬆查看。 'json.dump(..)'函數確實有'sort_keys'屬性,但是你不能提供一個自定義的排序函數(據我所知,不看它的實際執行情況)。如果'id'屬性的實際位置很重要,我會建議使用'sort_keys'屬性。 'id'屬性至少會處於一致/可預測的位置。 –

+1

所以,我檢查了'json.dump(..)'的實現。它確實硬編碼排序函數來排序鍵:'sorted(dct.items(),key = lambda kv:kv [0])''。 –

+0

@MarcoNawijn謝謝你的聲明。我沒有想到json將排序順序硬編碼。考慮到JSON被定義爲不在輸出端的特定順序的事實,我不明白爲什麼這是一個相關的問題,即使用戶遇到的問題也會引起我的興趣:) – Torxed