Ini adalah salah satu perbedaan halus di antara berbagai koleksi pemetaan yang dapat menggigit Anda. JSON memperlakukan kunci sebagai string; Python mendukung kunci yang berbeda hanya dengan tipe yang berbeda.
Dalam Python (dan tampaknya dalam Lua), kunci pemetaan (kamus atau tabel, masing-masing) adalah referensi objek. Dalam Python, mereka harus menjadi tipe yang tidak dapat diubah, atau mereka harus menjadi objek yang mengimplementasikan sebuah __hash__
metode. (Dokumen Lua menyarankan agar ia secara otomatis menggunakan ID objek sebagai hash / kunci bahkan untuk objek yang bisa berubah dan bergantung pada string internal untuk memastikan bahwa string yang setara dipetakan ke objek yang sama).
Di Perl, Javascript, awk dan banyak bahasa lainnya, kunci untuk hash, array asosiatif atau apapun sebutannya untuk bahasa yang diberikan, adalah string (atau "skalar" di Perl). Dalam perl $foo{1}, $foo{1.0}, and $foo{"1"}
semua referensi ke pemetaan yang sama di %foo
--- kunci dievaluasi sebagai skalar!
JSON dimulai sebagai teknologi serialisasi Javascript. (JSON singkatan dari J ava S cript O bject N otation .) Secara alami JSON mengimplementasikan semantik untuk notasi pemetaannya yang konsisten dengan semantik pemetaannya.
Jika kedua ujung serialisasi Anda adalah Python maka Anda akan lebih baik menggunakan acar. Jika Anda benar-benar perlu mengubahnya kembali dari JSON menjadi objek Python asli, saya kira Anda memiliki beberapa pilihan. Pertama, Anda dapat mencoba ( try: ... except: ...
) untuk mengonversi kunci apa pun menjadi angka jika pencarian kamus gagal. Alternatifnya, jika Anda menambahkan kode ke ujung yang lain (pembuat serial atau generator data JSON ini) maka Anda dapat membuatnya melakukan serialisasi JSON pada setiap nilai kunci --- menyediakannya sebagai daftar kunci. (Kemudian kode Python Anda pertama-tama akan mengulang daftar kunci, membuat instance / deserialisasi ke dalam objek Python asli ... dan kemudian menggunakannya untuk mengakses nilai dari pemetaan).