2013-06-14 3 views
24

Nach this conversion table werden Python-Ints als JSON-Nummern geschrieben, wenn sie mit dem JSON-Modul serialisiert werden - so wie ich es erwarten würde.Warum werden die int-Schlüssel eines Python-Diktats bei Verwendung von json.dumps zu Zeichenketten?

Ich habe ein Wörterbuch mit einem Integer-Schlüssel und Integer-Wert:

>>> d = {1:2} 
>>> type(d.items()[0][0]) 
<type 'int'> 
>>> type(d.items()[0][1]) 
<type 'int'> 

Wenn ich den json-Modul verwenden, um dies zu einem JSON-String serialisiert wird, wird der Wert als Zahl geschrieben, aber der Schlüssel geschrieben als String:

>>> json.dumps(d) 
'{"1": 2}' 

Dies ist nicht das Verhalten, das ich will, und es scheint, besonders gebrochen, da es json.dumps/json.loads Round-Tripping bricht:

>>> d == json.loads(json.dumps(d)) 
False 

Warum passiert das, und gibt es eine Möglichkeit, den Schlüssel als eine Zahl zu schreiben?

+4

JSON-Schlüssel sind * immer * Zeichenketten. – duffymo

+2

... und JSON verwendet Zeichenfolgen, da sie unabhängig von der Byte-Reihenfolge sind. – martineau

+3

Wenn JSON * nicht unbedingt * erforderlich ist, können Sie stattdessen YAML mit PyYAML verwenden: 'd = {1: 2, 3: 4}; Import Yaml; yaml.safe_load (yaml.safe_dump (d)) == d' gibt True zurück. Im Allgemeinen sieht der Inline-Stil von YAML wie ein flexibler json aus (Schlüssel können Zahlen sein, Zeichenfolgen müssen normalerweise nicht zitiert werden). Ich benutze 'safe_load' hier, weil normale' yaml.load' Funktionen hat (Aufbau von Klassen usw.), die schwer zu sichern sind; 'safe_load | dump' schränkt die Menge der unterstützten Ein-/Ausgaben auf primitive Typen (bool, int, float, string, list, set, dict) ein und ist somit sicher für beliebige Eingaben zu verwenden. – kampu

Antwort

31

Der einfache Grund ist, dass JSON does not allow integer keys.

object 
    {} 
    { members } 
members 
    pair 
    pair , members 
pair 
    string : value # Keys *must* be strings. 

Darüber, wie diese Einschränkung zu bekommen - Sie werden zunächst sicherstellen müssen, dass die empfangende Implementierung der technisch-invalid JSON verarbeiten kann. Dann können Sie entweder alle Anführungszeichen ersetzen oder einen benutzerdefinierten Serializer verwenden.

+1

Und im Gegensatz zu einfachen Javascript. Alle Schlüssel sollten zitiert werden. –

Verwandte Themen