Це одна з тих тонких відмінностей між різними колекціями карти, які можуть вас вкусити. JSON розглядає клавіші як рядки; Python підтримує різні клавіші, що відрізняються лише типом.
У Python (і, мабуть, у Луї) ключі до відображення (словник або таблиця відповідно) - це посилання на об'єкти. У 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 ..., а потім використовуючи ці для отримання значень із відображення).