C'est l'une de ces différences subtiles entre les différentes collections de cartographie qui peuvent vous mordre. JSON traite les clés comme des chaînes; Python prend en charge des clés distinctes ne différant que par le type.
En Python (et apparemment en Lua), les clés d'un mappage (dictionnaire ou table, respectivement) sont des références d'objet. En Python, ils doivent être des types immuables ou des objets qui implémentent une __hash__
méthode. (La documentation Lua suggère qu'il utilise automatiquement l'ID de l'objet comme un hachage / clé même pour les objets mutables et s'appuie sur l'internalisation de chaînes pour garantir que les chaînes équivalentes correspondent aux mêmes objets).
En Perl, Javascript, awk et de nombreux autres langages, les clés pour les hachages, les tableaux associatifs ou tout ce qu'ils appellent pour le langage donné, sont des chaînes (ou "scalaires" en Perl). En perl se $foo{1}, $foo{1.0}, and $foo{"1"}
trouvent toutes les références au même mappage en %foo
--- la clé est évaluée comme un scalaire!
JSON a commencé comme une technologie de sérialisation Javascript. (JSON signifie J ava S cript O bjet N ottaison.) Bien entendu , il met en oeuvre la sémantique pour sa notation de correspondance qui sont compatibles avec la sémantique de mappage.
Si les deux extrémités de votre sérialisation doivent être Python, vous feriez mieux d'utiliser des pickles. Si vous avez vraiment besoin de les reconvertir de JSON en objets Python natifs, je suppose que vous avez plusieurs choix. Vous pouvez d'abord essayer ( try: ... except: ...
) de convertir n'importe quelle clé en nombre en cas d'échec de la recherche dans le dictionnaire. Sinon, si vous ajoutez du code à l'autre extrémité (le sérialiseur ou le générateur de ces données JSON), vous pouvez lui demander d'effectuer une sérialisation JSON sur chacune des valeurs de clé - en les fournissant sous forme de liste de clés. (Ensuite, votre code Python itérerait d'abord sur la liste des clés, les instanciant / désérialisant en objets Python natifs ... puis les utiliserait pour accéder aux valeurs hors du mappage).