2017-05-04 2 views
2

Ich habe eine Datei, die ein JSON-Objekt enthält. Es wurde die folgende Art und Weise geladen:Python json.loads ändert die Reihenfolge des Objekts

with open('data.json', 'r') as input_file: 
    input_data = input_file.read() 

An diesem Punkt INPUT_DATA enthält nur einen String, und jetzt gehe ich es in JSON zu analysieren:

data_content = json.loads(input_data.decode('utf-8')) 

data_content hat die JSON Darstellung der Zeichenfolge, die ist was ich brauche, aber aus irgendeinem Grunde nicht klar für mich nach json.loads es der Auftrag ursprüngliche Reihenfolge der Tasten zu verändern, so zum Beispiel, wenn meine Datei so etwas wie enthalten:

{ "z_id": 312312, 
    "fname": "test", 
    "program": "none", 
    "org": null 
} 

Nach json.loads der Bestellung des verändert wird, lassen etwas sagen wie:

{ "fname": "test", 
    "program": None, 
    "z_id": 312312, 
    "org": "none" 
} 

Warum ist das passiert? Gibt es eine Möglichkeit, die Ordnung zu erhalten? Ich benutze Python 2.7.

+2

Warum benötigen Sie Wörterbuch bestellen? –

+1

Wenn Sie wirklich bestellen wollen, dann http://stackoverflow.com/questions/6921699/can-i-get-json-to-load-into-an-orderdeddict-in-python – tdelaney

+0

Ich glaube, das war ein schlechtes Beispiel, weil Die Schlüssel sind alphabetisch geordnet. Ich werde das Beispiel bearbeiten. Mein Punkt ist, dass ich möchte, dass das Objekt nicht verändert wird, sondern in der Reihenfolge, in der es ursprünglich hatte – Sebastian

Antwort

8

Wörterbücher (Objekte) in Python haben keine garantierte Reihenfolge. Wenn also in eine dict geparst wird, ist die Reihenfolge verloren.

Wenn die Bestellung aus irgendeinem Grund wichtig ist, können Sie json.loads stattdessen eine OrderedDict verwenden, die wie eine dict ist, aber die Reihenfolge der Schlüssel gespeichert wird.

from collections import OrderedDict 

data_content = json.loads(input_data.decode('utf-8'), object_pairs_hook=OrderedDict) 
+0

Ja, das hat das Problem gelöst. Vielen Dank Herr! – Sebastian

+1

Wow! Nach einem ganzen Tag der Fehlersuche funktionierte das für mich. PM mich, damit ich dir Eis kaufen kann. – kevthanewversi

4

Dies ist kein Problem mit json.load. Wörterbücher in Python sind nicht erzwungen, also werden Sie es außer Betrieb bekommen; im Allgemeinen ist es egal, weil Sie auf Strings basierende Elemente wie "id" zugreifen.

+0

Es spielt in diesem Fall eine Rolle da ich die Daten in eine Excel-Datei ablegen muss und die Struktur erhalten muss. Alle meine Dateien haben nicht die gleiche Struktur und können nicht auf jedes Element einzeln zugreifen. – Sebastian

Verwandte Themen