Sowohl Python dict
(vor Python 3.7) als auch das JSON-Objekt sind ungeordnete Sammlungen. Sie können sort_keys
Parameter übergeben, um die Schlüssel zu sortieren:
>>> import json
>>> json.dumps({'a': 1, 'b': 2})
'{"b": 2, "a": 1}'
>>> json.dumps({'a': 1, 'b': 2}, sort_keys=True)
'{"a": 1, "b": 2}'
Wenn Sie eine bestimmte Bestellung benötigen; Sie könnten verwendencollections.OrderedDict
:
>>> from collections import OrderedDict
>>> json.dumps(OrderedDict([("a", 1), ("b", 2)]))
'{"a": 1, "b": 2}'
>>> json.dumps(OrderedDict([("b", 2), ("a", 1)]))
'{"b": 2, "a": 1}'
Seit Python 3.6 bleibt die Reihenfolge der Schlüsselwortargumente erhalten und die oben genannten können mit einer besseren Syntax neu geschrieben werden:
>>> json.dumps(OrderedDict(a=1, b=2))
'{"a": 1, "b": 2}'
>>> json.dumps(OrderedDict(b=2, a=1))
'{"b": 2, "a": 1}'
Siehe PEP 468 - Beibehalten der Reihenfolge der Schlüsselwortargumente .
Wenn Ihre Eingabe als JSON angegeben wird, können Sie, um die Reihenfolge beizubehalten (zu erhalten OrderedDict
) object_pair_hook
, wie von @Fred Yankowski vorgeschlagen, übergeben :
>>> json.loads('{"a": 1, "b": 2}', object_pairs_hook=OrderedDict)
OrderedDict([('a', 1), ('b', 2)])
>>> json.loads('{"b": 2, "a": 1}', object_pairs_hook=OrderedDict)
OrderedDict([('b', 2), ('a', 1)])
OrderedDict()
, Sie können eindict
an übergebenOrderedDict()
, Sie können auch eine Liste der geordneten Paare an übergebendict()
- obwohl die Reihenfolge in beiden Fällen verloren geht.ordereddict_literals
auscodetransformer
Paket (Alpha-Qualität)d = json.load(f, object_pairs_hook=OrderedDict)
,json.dump(d)
behält ein späterer die Reihenfolge der ursprünglichen Elemente bei.Wie andere erwähnt haben, ist das zugrunde liegende Diktat ungeordnet. Es gibt jedoch OrderedDict-Objekte in Python. (Sie sind in den neuesten Pythons integriert, oder Sie können Folgendes verwenden: http://code.activestate.com/recipes/576693/ ).
Ich glaube, dass neuere Python-JSON-Implementierungen die eingebauten OrderedDicts korrekt verarbeiten, bin mir aber nicht sicher (und ich habe keinen einfachen Zugriff auf Tests).
Alte Python-SimpleJson-Implementierungen verarbeiten die OrderedDict-Objekte nicht gut. Sie konvertieren sie vor der Ausgabe in reguläre Diktate. Sie können dies jedoch wie folgt überwinden:
Wenn wir dies jetzt verwenden, erhalten wir:
Welches ist so ziemlich wie gewünscht.
Eine andere Alternative wäre, den Encoder so zu spezialisieren, dass er Ihre Zeilenklasse direkt verwendet, und dann würden Sie kein Zwischendiktat oder UnorderedDict benötigen.
quelle
sort_keys
,True
wenn Sie anrufenjson.dumps()
; Für die Bestellstabilität (zum Testen, stabiles Caching oder VCS-Commits) reichen Sortierschlüssel aus.Die Reihenfolge eines Wörterbuchs hat keine Beziehung zu der Reihenfolge, in der es definiert wurde. Dies gilt für alle Wörterbücher, nicht nur für diejenigen, die in JSON umgewandelt wurden.
In der Tat wurde das Wörterbuch "auf den Kopf gestellt", bevor es überhaupt erreichte
json.dumps
:quelle
Hey, ich weiß, es ist so spät für diese Antwort, aber füge sort_keys hinzu und weise ihr wie folgt false zu:
das hat bei mir funktioniert
quelle
json.dump () behält die Reihenfolge Ihres Wörterbuchs bei. Öffnen Sie die Datei in einem Texteditor und Sie werden sehen. Die Bestellung bleibt erhalten, unabhängig davon, ob Sie ihr ein OrderedDict senden.
Json.load () verliert jedoch die Reihenfolge des gespeicherten Objekts, es sei denn, Sie weisen es an, es in ein OrderedDict () zu laden. Dies erfolgt mit dem Parameter object_pairs_hook, wie oben von JFSebastian angegeben.
Andernfalls würde die Reihenfolge verloren gehen, da bei normalem Betrieb das gespeicherte Wörterbuchobjekt in ein reguläres Diktat geladen wird und ein reguläres Diktat die Reihenfolge der angegebenen Elemente nicht beibehält.
quelle
In JSON ist die Reihenfolge der Objektschlüssel wie in Javascript bedeutungslos. Es spielt also keine Rolle, in welcher Reihenfolge sie angezeigt werden. Es handelt sich um dasselbe Objekt.
quelle
dict
)