Wie die anderen gesagt haben, dict
ungeordnet ist. collections.OrderedDict
ist eine dict-Unterklasse, deren Schlüssel geordnet sind. Das Problem ist, dass json.load
eine dict
direkt zurückgibt, und wir können nicht einfach das Ergebnis in eine werfen, da die Reihenfolge der Schlüssel bereits Informationen zu diesem Zeitpunkt verloren ist.
Wir müssen einen Weg json.load
zu sagen, ein OrderedDict
anstelle eines dict
.Dieses zurückkehren kann durch die Implementierung eines benutzerdefinierten json.JSONDecoder
, die ein object_pairs_hook
liefert erfolgen. Die object_pairs_hook
erhält ein JSON-Objekt als eine Liste von (key, value)
Tupel in der Reihenfolge, in der sie im JSON-Dokument erscheinen. Es sollte die Übersetzung dieses Objekts in ein Python-Objekt zurückgeben. Wir werden diese Tupelliste an den Initialisierer für collections.OrderedDict
übergeben, und das sollte reichen.
Hier einige Code:
data = """
{
"foo": "bar",
"a_list": [1, 2, 3],
"another_object": {
"c": 3,
"a": 1,
"b": 2
},
"last_key": 42
}
"""
decoder = json.JSONDecoder(object_pairs_hook=collections.OrderedDict)
result = decoder.decode(data)
print(result)
die gibt:
OrderedDict([('foo', 'bar'),
('a_list', [1, 2, 3]),
('another_object', OrderedDict([('c', 3), ('a', 1), ('b', 2)])),
('last_key', 42)])
Schließlich Sie fragen sich vielleicht, "Warum ist dies so viel zusätzliche Arbeit?". Nun, JSON soll nicht als Datenstruktur mit einer festen Reihenfolge behandelt werden. Sie gehen gegen den Strich, indem Sie dies tun.
Können Sie es durch das Objekt zu lesen, und wie Sie jedes Lese Objekt einen Auftrag Schlüssel hinzufügen. Ich habe noch nie mit JSON gearbeitet, aber ich würde mir etwas vorstellen wie das erste Lesen der Datei und dann das Iterieren jedes Objekts und beim Konvertieren in JSON ein neues Attribut hinzufügen - die ursprüngliche Reihenfolge – PyNEwbie
Ein JSON-Objekt ist [per Definition] (http://www.json.org), "eine ungeordnete Menge von Name/Wert-Paaren". Sie sollten wirklich keine JSON-Objekte verwenden (oder vielleicht sollten Sie nicht einmal JSON verwenden), wenn die Reihenfolge wichtig ist, in der die Schlüssel/Wert-Paare ursprünglich angegeben wurden. –