2012-04-18 76 views
8

我想要將json字符串轉換爲Python字典時遇到問題。我有串狀如何將json字符串轉換爲字典並在鍵中保存順序?

s={"name":{"Saban:Saulic"},"price":{"koncert:1000"} ....} 

時,我喜歡寫東西

tags=json.loads(s) 

我gtet字典,而是按鍵的順序並不像串一樣(它沒有名稱,價格......)。如何將json字符串轉換爲字典並在鍵中保存順序?

+2

Python字典是無序的,因爲通常你訪問的條目*者皆*這是很好的,如果你有遍歷元素時,訂單通常並不重要。順便說一句,'s'既不是字符串,也不是字典,如果它是一個字符串,則無效。它看起來像是在一個不同的結構之後,比如一組對象:'[{「name」:「...」,「price」:「...」},...]'。如果你提供了一些解釋*爲什麼*你需要按順序鍵並提供一個正確的例子,那麼我們可以幫助你更好。 – 2012-04-18 09:51:30

+0

在'dict'中並沒有真正的「按鍵順序」這樣的事情。你可以一次迭代它們,但是不能控制你得到它們的順序。 – 2012-04-18 10:05:39

+3

我認爲[this previous](http:// stackoverflow。com/questions/6921699/can-i-get -json-to-load-into-an-ordereddict-in-python)Stackoverflow的問題提供了一個答案。 – Alvin 2012-04-18 10:06:43

回答

21

由於Python 2.7你從collections

OrderedDict模塊這類詞典的保留元素的插入順序。

從Python文檔:

json.load(fp[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])

反序列化FP(一個.read() - 支撐包含 JSON文檔類文件對象),以Python對象。

如果FP的內容被與其他 比UTF-8的基於ASCII編碼的(例如拉丁-1),則必須 指定適當的編碼名稱。不是基於ASCII的編碼(例如UCS-2)不允許使用 ,應使用codecs.getreader(encoding)(fp)或 將其封裝爲簡單解碼爲unicode對象並傳遞給loads()。

object_hook是一個可選函數,將使用任何對象字面解碼(字典)的 結果調用。將使用返回值 object_hook而不是字典。這個特性可以用 來實現自定義解碼器(例如JSON-RPC類提示)。

object_pairs_hook是一個可選函數,它將與 的任何對象文本的結果一起使用有序列對進行解碼。 將使用object_pairs_hook的返回值代替 字典。此功能可用於實現自定義解碼器,這些解碼器依賴於密鑰和值對解碼的順序(例如, collections.OrderedDict()將記住插入的順序)。如果還定義了 object_hook,則object_pairs_hook優先。

我想你可以使用object_pairs_hook參數與collections.OrderedDict()

tags=json.loads(s, object_pairs_hook=collections.OrderedDict) 
相關問題