では、OrderedDictをで使用できるようにしjson.dump
ます。つまり、OrderedDictはJSONへの入力として使用できます。
しかし、それを出力として使用できますか?もしそうなら?私の場合load
、OrderedDict に入れて、ファイル内のキーの順序を維持できるようにします。
そうでない場合、何らかの回避策はありますか?
json.load
PythonでDictの代わりにOrderedDictsを使用するために簡単にチェックインできるとすばらしいでしょう。
では、OrderedDictをで使用できるようにしjson.dump
ます。つまり、OrderedDictはJSONへの入力として使用できます。
しかし、それを出力として使用できますか?もしそうなら?私の場合load
、OrderedDict に入れて、ファイル内のキーの順序を維持できるようにします。
そうでない場合、何らかの回避策はありますか?
json.load
PythonでDictの代わりにOrderedDictsを使用するために簡単にチェックインできるとすばらしいでしょう。
回答:
はい、できます。JSONDecoderにobject_pairs_hook
引数を指定する。実際、これはドキュメントに記載されているとおりの例です。
>>> json.JSONDecoder(object_pairs_hook=collections.OrderedDict).decode('{"foo":1, "bar": 2}')
OrderedDict([('foo', 1), ('bar', 2)])
>>>
このパラメーターを次のように渡すことができますjson.loads
(他の目的でDecoderインスタンスが必要ない場合)。
>>> 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)
object_pairs_hook
、「各ペアがobject_pairs_hookに渡される」ではなく、リストとして順番にに渡されるという意味
OrderedDict
、結果のpython値が作成されます。
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)
simplejson
とordereddict
あなたがインストールする必要があることを別のライブラリです。
loads('{}', object_pairs_hook=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
だからあなたの質問への答えは今では次のようになります:python 3.6にアップグレードしてください!:)
json.loads('{"2": 2, "1": 1}')
は{'1': 1, '2': 2}
、私のためになります。
dict.__repr__
は、基になる順序が保持されている間、キーをソートするように見えます。つまり、json.loads('{"2": 2, "1": 1}').items()
でdict_items([('2', 2), ('1', 1)])
あってもrepr(json.loads('{"2": 2, "1": 1}'))
です"{'1': 1, '2': 2}"
。
dictをダンプすることに加えて、常にキーのリストを書き出し、リストをOrderedDict
反復してを再構築できますか?
OrdereDict
s を使用して再帰的に実行する必要があるようです。
キーの順序付きリストをディクショナリと一緒にダンプすることに加えて、明示的であるという利点がある別のローテクソリューションは、キーと値のペアの(順序付き)リストをダンプすることordered_dict.items()
です。読み込みは簡単OrderedDict(<list of key-value pairs>)
です。JSONにはこの概念がない(JSON辞書には順序がない)にもかかわらず、これは順序付けされた辞書を処理します。
json
OrderedDictを正しい順序でダンプするという事実を利用することは確かに素晴らしいことです。ただし、すべての JSON辞書を(object_pairs_hook
引数を介して)OrderedDictとして読み取る必要があることは、一般に不必要に重く、必ずしも意味がないため、順序付けする必要がある辞書のみの明示的な変換も意味があります。