2012-04-18 9 views
8

Ich habe ein Problem, wenn ich Json String in Python-Wörterbuch konvertieren will. Ich habe String wieWie konvertiert man die JSON-Zeichenfolge in ein Wörterbuch und speichert die Reihenfolge in den Schlüsseln?

s={"name":{"Saban:Saulic"},"price":{"koncert:1000"} ....} 

wenn ich schreibe so etwas wie

tags=json.loads(s) 

I gtet Wörterbuch aber Reihenfolge der Tasten ist nicht das gleiche wie in string (es ist nicht Name, Preis ...). Wie konvertiert man die JSON-Zeichenfolge in ein Wörterbuch und speichert die Reihenfolge in den Schlüsseln?

+2

Python-Dictionaries ungeordnete sind, was in Ordnung ist, weil normalerweise die Einträge zugreifen * von Taste *, und wenn Sie über die Elemente zu durchlaufen haben, die Ordnung spielt normalerweise keine Rolle. Btw, 's' ist weder ein String noch ein Wörterbuch, das nicht gültig ist, wenn JSON eine Zeichenfolge ist. Es sieht so aus, als ob Sie nach einer anderen Struktur suchen, zum Beispiel nach einem Array von Objekten: '[{" name ":" ... "," price ":" ... "}, ...]'. Wenn Sie eine Erklärung für * warum * geben, benötigen Sie die Schlüssel in der richtigen Reihenfolge und liefern ein korrektes Beispiel, dann können wir Ihnen besser helfen. –

+0

Es gibt nicht wirklich so etwas wie "Reihenfolge der Schlüssel" in einem "Diktat". Sie können nacheinander über sie hinweg iterieren, aber es gibt keine Kontrolle darüber, in welcher Reihenfolge Sie sie erhalten. –

+3

Ich denke [diese vorherige] (http: // stackoverflow.com/questions/6921699/can-i-get-json-zu-laden-in-einem-ordereddict-in-python) Frage hier auf Stackoverflow bietet eine Antwort. – Alvin

Antwort

21

Seit Python 2.7 haben Sie OrderedDict Modul von collections

Diese Art von Wörterbuch bewahrt die Einführungsreihenfolge der Elemente.

Von Python-Dokumentation:

json.load(fp[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])

Deserialize fp (a .lesen() - Unterstützung von Datei-ähnliche Objekts ein JSON Dokument enthält) zu einem Python-Objekt.

Wenn der Inhalt von fp mit einer ASCII-basierten Codierung anderer als UTF-8 (z. B. latin-1) codiert wird, muss ein entsprechender Codierungsname angegeben werden. Kodierungen, die nicht ASCII-basiert sind (wie UCS-2), sind nicht erlaubt und sollten mit codecs.getreader (encoding) (fp) oder einfach in ein Unicode-Objekt dekodiert und an loads() übergeben werden.

object_hook ist eine optionale Funktion, die mit dem Ergebnis eines beliebigen dekodierten Objektliterals (ein dict) aufgerufen wird. Der Rückgabewert object_hook wird anstelle des dict verwendet. Diese Funktion kann verwendet werden, um benutzerdefinierte Decoder zu implementieren (z. B. JSON-RPC-Klassenhinweis).

object_pairs_hook ist eine optionale Funktion, die mit dem Ergebnis eines beliebigen Objektliterals mit einer geordneten Liste von Paaren dekodiert wird. Der Rückgabewert von object_pairs_hook wird anstelle des dict verwendet. Mit dieser Funktion können benutzerdefinierte Decoder implementiert werden, die in der Reihenfolge verwenden, in der die Schlüssel- und Wertepaare dekodiert werden (z. B. collections.OrderedDict() speichert die Reihenfolge der Einfügung). Wenn object_hook ebenfalls definiert ist, hat der object_pairs_hook Priorität.

Ich glaube, Sie Parameter verwenden object_pairs_hook könnte mit collections.OrderedDict()

tags=json.loads(s, object_pairs_hook=collections.OrderedDict) 
Verwandte Themen