Это одно из тех тонких различий между различными коллекциями карт, которые могут вас укусить.
В 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] bject [n] otation.) Естественно, он реализует семантику для своей записи отображения, которая согласуется с его семантикой отображения.
Если оба конца вашей сериализации будут Python, то вам лучше использовать соленые огурцы. Если вам действительно нужно преобразовать их обратно из JSON в нативные объекты Python, я думаю, у вас есть несколько вариантов. Сначала вы можете попробовать (try: ... except: ...
) преобразовать любой ключ в число в случае сбоя при поиске в словаре. В качестве альтернативы, если вы добавляете код на другой конец (сериализатор или генератор этих данных JSON), вы можете заставить его выполнять сериализацию JSON для каждого из значений ключей, предоставляя их в виде списка ключей. (Тогда ваш код Python будет сначала перебирать список ключей, инстанцировать / десериализовывать их в нативные объекты Python ... а затем использовать их для доступа к значениям из сопоставления).