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?
JSON-Schlüssel sind * immer * Zeichenketten. – duffymo
... und JSON verwendet Zeichenfolgen, da sie unabhängig von der Byte-Reihenfolge sind. – martineau
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