Это одно из тех тонких различий между различными коллекциями карт, которые могут вас укусить. JSON обрабатывает ключи как строки; Python поддерживает отдельные ключи, различающиеся только типом.
В Python (и, очевидно, в Lua) ключи к отображению (словарь или таблица, соответственно) являются ссылками на объекты. В Python они должны быть неизменяемыми типами или должны быть объектами, реализующими __hash__
метод. (Документы Lua предполагают, что он автоматически использует идентификатор объекта в качестве хэша / ключа даже для изменяемых объектов и полагается на интернирование строк, чтобы гарантировать, что эквивалентные строки сопоставляются с одними и теми же объектами).
В Perl, Javascript, awk и многих других языках ключи для хэшей, ассоциативных массивов или того, что они называются для данного языка, являются строками (или «скалярами» в Perl). В Perl $foo{1}, $foo{1.0}, and $foo{"1"}
все ссылки на одно и то же отображение %foo
--- ключ оценивается как скаляр!
JSON начинался как технология сериализации Javascript. (JSON означает J AVA S cript O ▪ Таблица N otation.) Естественно , что она реализует семантику для его отображения обозначений , которые согласуются с его отображения семантики.
Если оба конца вашей сериализации будут Python, вам лучше использовать соленья. Если вам действительно нужно преобразовать их обратно из JSON в собственные объекты Python, я думаю, у вас есть несколько вариантов. Сначала вы можете попробовать ( try: ... except: ...
) преобразовать любой ключ в число в случае сбоя поиска по словарю. В качестве альтернативы, если вы добавите код на другой конец (сериализатор или генератор этих данных JSON), вы можете заставить его выполнить сериализацию JSON для каждого из значений ключа, предоставив их в виде списка ключей. (Тогда ваш код Python сначала будет перебирать список ключей, создавая / десериализуя их в собственные объекты Python ... а затем использовать их для доступа к значениям из сопоставления).