To jedna z tych subtelnych różnic między różnymi kolekcjami map, które mogą cię ugryźć. JSON traktuje klucze jako ciągi znaków; Python obsługuje różne klucze różniące się tylko typem.
W Pythonie (i najwyraźniej w Lua) kluczami do mapowania (odpowiednio słownika lub tabeli) są odwołania do obiektów. W Pythonie muszą być typami niezmiennymi lub muszą być obiektami implementującymi __hash__metodę. (Dokumentacja Lua sugeruje, że automatycznie używa identyfikatora obiektu jako skrótu / klucza nawet dla obiektów podlegających zmianom i polega na internowaniu ciągów, aby zapewnić, że równoważne ciągi są mapowane na te same obiekty).
W Perlu, Javascript, awk i wielu innych językach klucze do skrótów, tablic asocjacyjnych lub czegokolwiek, co się nazywa w danym języku, to łańcuchy (lub „skalary” w Perlu). W perlu $foo{1}, $foo{1.0}, and $foo{"1"}są wszystkie odniesienia do tego samego mapowania w %foo--- klucz jest oceniany jako skalar!
JSON powstał jako technologia serializacji JavaScript. (JSON oznacza J Ava S CRIPT O bject N otation). Naturalnie realizuje semantyki dla jego zapis mapowania, które są zgodne z jego semantyki mapowania.
Jeśli oba końce serializacji mają być w Pythonie, lepiej byłoby użyć pikli. Jeśli naprawdę potrzebujesz przekonwertować je z powrotem z JSON na natywne obiekty Pythona, myślę, że masz kilka możliwości. Najpierw możesz spróbować ( try: ... except: ...), aby przekonwertować dowolny klucz na liczbę w przypadku niepowodzenia wyszukiwania w słowniku. Alternatywnie, jeśli dodasz kod na drugim końcu (serializator lub generator tych danych JSON), możesz zlecić wykonanie serializacji JSON na każdej z wartości klucza - dostarczając je jako listę kluczy. (Następnie twój kod Pythona najpierw iteruje listę kluczy, tworząc instancję / deserializując je w natywne obiekty Pythona ... a następnie użyje ich do uzyskania dostępu do wartości poza mapowaniem).