2015-10-28 59 views
4

我有一個字典,我發送到一個API,不幸的是API需要字典是在一個非常特定的順序。我從文件加載字典。OrderedDict在Python中的特定順序

現在json.load(fh, object_pairs_hook=OrderedDict)完全按照它應該做的和按字母順序排列頂級關鍵字,但是我需要對字典進行不同的排序。

特定的順序:

{ 
    "kind": "string", 
    "apiVersion": "string", 
    "metadata": {...}, 
    "spec": { 
    "subKey": "string" 
    } 
} 

如何指定頂部和子水位鍵與從文件加載字典的字典順序?

+0

JSON對象不應該排序,所以你可能不應該使用'json'。 – chepner

+0

@chepner我沒有選擇,必須訂購。 – mxplusb

回答

3

在Python中,OrderedDict中的項目順序與它們寫入的順序相同。

所以,如果你想在創建OrderedDict時控制物品的順序,你可以他們在你想要的順序。對於現有的OrderedDict,可以按照的順序讀出,刪除並寫回

在您的例子,如果你需要調整項目的順序,你可以這樣做:

orders = ("kind", "apiVersion", "metadata", "spec") 
for key in orders: 
    v = object_pairs_hook[key] 
    del object_pairs_hook[key] 
    object_pairs_hook[key] = v 
+0

好點。你知道如何在讀完它們之後再編寫它們嗎? – mxplusb

+0

你的問題有點混亂。如果遇到麻煩,請嘗試使用OrderedDict編寫一些代碼併發布特定問題。 – RobertB

+0

@mynameismevin查看我的編輯 – stanleyli

2

你在這種情況下沒有必要objects_pairs_hook,只是從它使用自定義加載JSON文件,並創建OrderedDict排序:

SORT_ORDER = { 
    "kind": 0, 
    "apiVersion": 1, 
    "metadata": 2, 
    "spec": 3 
} 

d = json.load(fh) 
d = OrderedDict(sorted(d.items(), key=lambda x: SORT_ORDER.get(x[0])))