python tool 我可以讓JSON加載到OrderedDict嗎?




python string to json (5)

好的,我可以在json.dump使用OrderedDict。 也就是說,OrderedDict可以用作JSON的輸入。

但它可以用作輸出嗎? 如果是這樣如何? 在我的情況下,我想load到OrderedDict中,這樣我就可以在文件中保留鍵的順序。

如果沒有,是否有某種解決方法?


除了傾銷字典之外,您總是可以寫出鍵列表,然後通過遍歷列表來重建OrderedDict


是的你可以。 通過為JSONDecoder指定object_pairs_hook參數。 實際上,這是文檔中給出的確切示例。

>>> json.JSONDecoder(object_pairs_hook=collections.OrderedDict).decode('{"foo":1, "bar": 2}')
OrderedDict([('foo', 1), ('bar', 2)])
>>> 

您可以將此參數傳遞給json.loads (如果您不需要解碼器實例用於其他用途),如下所示:

>>> import json
>>> from collections import OrderedDict
>>> data = json.loads('{"foo":1, "bar": 2}', object_pairs_hook=OrderedDict)
>>> print json.dumps(data, indent=4)
{
    "foo": 1,
    "bar": 2
}
>>> 

使用json.load以同樣的方式完成:

>>> data = json.load(open('config.json'), object_pairs_hook=OrderedDict)

Python 2.7+的簡單版本

my_ordered_dict = json.loads(json_str, object_pairs_hook=collections.OrderedDict)

或者對於Python 2.4到2.6

import simplejson as json
import ordereddict

my_ordered_dict = json.loads(json_str, object_pairs_hook=ordereddict.OrderedDict)

一些好消息! 自3.6版本以來,cPython實現保留了詞典的插入順序( https://mail.python.org/pipermail/python-dev/2016-September/146327.html )。 這意味著默認情況下json庫現在是保存順序的。 觀察python 3.5和3.6之間的行為差異。 代碼:

import json
data = json.loads('{"foo":1, "bar":2, "fiddle":{"bar":2, "foo":1}}')
print(json.dumps(data, indent=4))

在py3.5中,結果順序是未定義的:

{
    "fiddle": {
        "bar": 2,
        "foo": 1
    },
    "bar": 2,
    "foo": 1
}

在python 3.6的cPython實現中:

{
    "foo": 1,
    "bar": 2,
    "fiddle": {
        "bar": 2,
        "foo": 1
    }
}

真正好消息是這已經成為python 3.7的語言規範(與cPython 3.6+的實現細節相對): https://mail.python.org/pipermail/python-dev/2017-December/151283.html ://mail.python.org/pipermail/python-dev/2017-December/151283 https://mail.python.org/pipermail/python-dev/2017-December/151283.html

所以現在你的問題的答案變成:升級到python 3.6! :)


除了在字典旁邊傾倒有序的鍵列表之外,另一個具有顯式優勢的低技術解決方案是轉儲鍵值對的ordered_dict.items() 。 加載是一個簡單的OrderedDict(<list of key-value pairs>) 。 儘管JSON沒有這個概念(JSON字典沒有順序),但它處理有序的字典。

利用json以正確的順序轉儲OrderedDict這一事實確實不錯。 然而,它通常不必要地沉重,並且必須將所有 JSON字典作為OrderedDict(通過object_pairs_hook參數)來讀取,因此顯式地轉換必須排序的字典也是有意義的。





ordereddictionary