Ok, damit ich ein OrderedDict in verwenden kann json.dump
. Das heißt, ein OrderedDict kann als Eingabe für JSON verwendet werden.
Aber kann es als Ausgabe verwendet werden? Wenn das so ist, wie? In meinem Fall möchte ich load
ein OrderedDict erstellen, damit ich die Reihenfolge der Schlüssel in der Datei beibehalten kann.
Wenn nicht, gibt es eine Problemumgehung?
python
json
load
ordereddictionary
c00kiemonster
quelle
quelle
json.load
zu haben, um OrderedDicts anstelle von Dicts in Python zu verwenden.Antworten:
Ja, du kannst. Durch Angabe des
object_pairs_hook
Arguments an JSONDecoder . Tatsächlich ist dies das genaue Beispiel in der Dokumentation.Sie können diesen Parameter wie
json.loads
folgt übergeben (wenn Sie keine Decoder-Instanz für andere Zwecke benötigen):Die Verwendung
json.load
erfolgt auf die gleiche Weise:quelle
object_pairs_hook
und nicht an" jedes Paar wird an object_pairs_hook übergeben "übergeben wirdjson.load
es nicht standardmäßig geordnet bleibt, sondern nur das widerspiegelt, was json selbst tut - die{}
sind ungeordnet, aber die[]
im json sind wie hierOrderedDict
wird, wird der resultierende Python-Wert erstellt.Einfache Version für Python 2.7+
Oder für Python 2.4 bis 2.6
quelle
simplejson
undordereddict
sind separate Bibliotheken, die Sie installieren müssen.loads('{}', object_pairs_hook=OrderedDict)
.Einige gute Neuigkeiten! Seit Version 3.6 hat die cPython-Implementierung die Einfügereihenfolge der Wörterbücher beibehalten ( https://mail.python.org/pipermail/python-dev/2016-September/146327.html ). Dies bedeutet, dass die JSON-Bibliothek jetzt standardmäßig die Reihenfolge beibehält. Beachten Sie den Unterschied im Verhalten zwischen Python 3.5 und 3.6. Der Code:
In py3.5 ist die resultierende Reihenfolge undefiniert:
In der cPython-Implementierung von Python 3.6:
Die wirklich gute Nachricht ist, dass dies ab Python 3.7 zu einer Sprachspezifikation geworden ist (im Gegensatz zu einem Implementierungsdetail von cPython 3.6+): https://mail.python.org/pipermail/python-dev/2017-December/151283 .html
Die Antwort auf Ihre Frage lautet nun: Upgrade auf Python 3.6! :) :)
quelle
json.loads('{"2": 2, "1": 1}')
wird es in der CPython-Implementierung von Python 3.6.4{'1': 1, '2': 2}
für mich.dict.__repr__
Schlüssel sortiert, während die zugrunde liegende Reihenfolge beibehalten wird. Mit anderen Worten,json.loads('{"2": 2, "1": 1}').items()
istdict_items([('2', 2), ('1', 1)])
selbst wennrepr(json.loads('{"2": 2, "1": 1}'))
ist"{'1': 1, '2': 2}"
.Sie könnten immer die Liste der Schlüssel zusätzlich zum Dumping des Diktats aufschreiben und dann das rekonstruieren,
OrderedDict
indem Sie die Liste durchlaufen?quelle
OrdereDict
s durchgeführt werden.Neben dem Speichern der geordneten Liste von Schlüsseln neben dem Wörterbuch besteht eine weitere Low-Tech-Lösung, die den Vorteil hat, explizit zu sein, darin, die (geordnete) Liste von Schlüssel-Wert-Paaren zu
ordered_dict.items()
sichern. Laden ist einfachOrderedDict(<list of key-value pairs>)
. Dies behandelt ein geordnetes Wörterbuch, obwohl JSON dieses Konzept nicht hat (JSON-Wörterbücher haben keine Reihenfolge).Es ist in der Tat schön, die Tatsache auszunutzen, dass
json
das OrderedDict in der richtigen Reihenfolge ausgegeben wird. Im Allgemeinen ist es jedoch unnötig schwer und nicht unbedingt sinnvoll, alle JSON-Wörterbücher als OrderedDict (durch dasobject_pairs_hook
Argument) lesen zu müssen. Daher ist auch eine explizite Konvertierung nur der Wörterbücher sinnvoll, die bestellt werden müssen.quelle
Der normalerweise verwendete Ladebefehl funktioniert, wenn Sie den Parameter object_pairs_hook angeben :
quelle