Esta es una de esas sutiles diferencias entre varias colecciones de mapas que pueden morderte. JSON trata las claves como cadenas; Python admite teclas distintas que difieren solo en tipo.
En Python (y aparentemente en Lua) las claves de un mapeo (diccionario o tabla, respectivamente) son referencias de objetos. En Python deben ser tipos inmutables, o deben ser objetos que implementen un__hash__
método. (Los documentos de Lua sugieren que usa automáticamente la ID del objeto como un hash / clave incluso para objetos mutables y se basa en el internamiento de cadenas para garantizar que las cadenas equivalentes se asignen a los mismos objetos).
En Perl, Javascript, awk y muchos otros idiomas, las claves para hash, matrices asociativas o como se llamen para el idioma dado son cadenas (o "escalares" en Perl). En perl $foo{1}, $foo{1.0}, and $foo{"1"}
están todas las referencias a la misma asignación en %foo
--- se evalúa la clave como escalar!
JSON comenzó como una tecnología de serialización Javascript. (JSON significa J ava S cript O bject N otation.) Naturalmente implementa semántica para su notación de mapeo que es consistente con su semántica de mapeo.
Si ambos extremos de su serialización van a ser Python, entonces sería mejor usar encurtidos. Si realmente necesita convertirlos de JSON a objetos nativos de Python, supongo que tiene un par de opciones. Primero, puede intentar ( try: ... except: ...
) convertir cualquier clave en un número en caso de un error en la búsqueda del diccionario. Alternativamente, si agrega código al otro extremo (el serializador o generador de estos datos JSON), puede hacer que realice una serialización JSON en cada uno de los valores clave, proporcionándolos como una lista de claves. (Luego, su código Python primero iteraría sobre la lista de claves, instanciando / deserializándolas en objetos nativos de Python ... y luego las usaría para acceder a los valores fuera de la asignación).