Essa é uma daquelas diferenças sutis entre várias coleções de mapeamento que podem morder você. JSON trata as chaves como strings; O Python suporta chaves distintas, diferindo apenas no tipo.
No Python (e aparentemente em Lua), as chaves para um mapeamento (dicionário ou tabela, respectivamente) são referências a objetos. No Python, eles devem ser tipos imutáveis ou objetos que implementam um __hash__
método. (Os documentos de Lua sugerem que ele use automaticamente o ID do objeto como um hash / chave, mesmo para objetos mutáveis e confie na internação de cadeias para garantir que cadeias equivalentes sejam mapeadas para os mesmos objetos).
No Perl, Javascript, awk e muitas outras linguagens, as chaves para hashes, matrizes associativas ou o que quer que sejam chamadas para o idioma especificado, são strings (ou "escalares" no Perl). Em perl $foo{1}, $foo{1.0}, and $foo{"1"}
estão todas as referências ao mesmo mapeamento em %foo
--- a chave é avaliada como um escalar!
JSON começou como uma tecnologia de serialização Javascript. (JSON meios J ava S cript O bject N otation.) Naturalmente que implementa semântica para a sua notação de mapeamento que são consistentes com a sua semântica de mapeamento.
Se as duas extremidades da sua serialização forem Python, é melhor usar pickles. Se você realmente precisar convertê-los novamente do JSON em objetos Python nativos, acho que você tem algumas opções. Primeiro, você pode tentar ( try: ... except: ...
) converter qualquer chave em um número no caso de uma falha na pesquisa do dicionário. Como alternativa, se você adicionar código à outra extremidade (o serializador ou gerador desses dados JSON), poderá executar uma serialização JSON em cada um dos valores de chave - fornecendo-os como uma lista de chaves. (Em seguida, seu código Python primeiro itera sobre a lista de chaves, instanciando / desserializando-as em objetos Python nativos ... e depois os utiliza para acessar os valores do mapeamento).