Dies ist einer dieser subtilen Unterschiede zwischen verschiedenen Mapping-Sammlungen, die Sie beißen können. JSON behandelt Schlüssel als Zeichenfolgen. Python unterstützt unterschiedliche Schlüssel, die sich nur im Typ unterscheiden.
In Python (und anscheinend in Lua) sind die Schlüssel für eine Zuordnung (Wörterbuch bzw. Tabelle) Objektreferenzen. In Python müssen sie unveränderliche Typen sein oder Objekte, die eine __hash__
Methode implementieren . (Die Lua-Dokumente schlagen vor, dass die Objekt-ID automatisch als Hash / Schlüssel verwendet wird, auch für veränderbare Objekte, und dass die interne Zeichenfolge verwendet wird, um sicherzustellen, dass äquivalente Zeichenfolgen denselben Objekten zugeordnet werden.)
In Perl, Javascript, awk und vielen anderen Sprachen sind die Schlüssel für Hashes, assoziative Arrays oder wie auch immer sie für die angegebene Sprache genannt werden, Zeichenfolgen (oder "Skalare" in Perl). In Perl $foo{1}, $foo{1.0}, and $foo{"1"}
sind alle Verweise auf dasselbe Mapping in %foo
--- der Schlüssel wird als Skalar ausgewertet !
JSON wurde als Javascript-Serialisierungstechnologie gestartet. (JSON steht für J ava S cript O bject N otation.) Natürlich implementiert es Semantik für seine Mapping-Notation, die mit seiner Mapping-Semantik übereinstimmt.
Wenn beide Enden Ihrer Serialisierung Python sein sollen, sollten Sie Pickles verwenden. Wenn Sie diese wirklich von JSON zurück in native Python-Objekte konvertieren müssen, haben Sie vermutlich mehrere Möglichkeiten. Zuerst könnten Sie versuchen ( try: ... except: ...
), einen beliebigen Schlüssel in eine Zahl umzuwandeln, falls die Suche nach einem Wörterbuch fehlschlägt. Wenn Sie dem anderen Ende (dem Serializer oder Generator dieser JSON-Daten) Code hinzufügen, können Sie alternativ eine JSON-Serialisierung für jeden der Schlüsselwerte durchführen lassen - und diese als Liste der Schlüssel bereitstellen. (Dann iteriert Ihr Python-Code zuerst über die Liste der Schlüssel, instanziiert / deserialisiert sie in native Python-Objekte ... und verwendet diese dann für den Zugriff auf die Werte aus der Zuordnung).