Đây là một trong những khác biệt tinh tế giữa các bộ sưu tập bản đồ khác nhau có thể cắn bạn. JSON coi các khóa là chuỗi; Python hỗ trợ các khóa riêng biệt chỉ khác nhau về loại.
Trong Python (và dường như trong Lua), các khóa để ánh xạ (từ điển hoặc bảng tương ứng) là các tham chiếu đối tượng. Trong Python, chúng phải là các kiểu bất biến hoặc chúng phải là các đối tượng thực hiện một__hash__
phương thức. (Các tài liệu Lua đề xuất rằng nó tự động sử dụng ID của đối tượng làm hàm băm / khóa ngay cả đối với các đối tượng có thể thay đổi và dựa vào thực tập chuỗi để đảm bảo rằng các chuỗi tương đương ánh xạ tới cùng các đối tượng).
Trong Perl, Javascript, awk và nhiều ngôn ngữ khác, các khóa để băm, mảng kết hợp hoặc bất cứ thứ gì chúng được gọi cho ngôn ngữ đã cho, là các chuỗi (hoặc "vô hướng" trong Perl). Trong perl $foo{1}, $foo{1.0}, and $foo{"1"}
đều tham chiếu đến các bản đồ tương tự trong %foo
--- phím được đánh giá là vô hướng!
JSON bắt đầu như một công nghệ tuần tự hóa Javascript. (JSON là viết tắt của J ava S cript O bject N otation.) Đương nhiên, nó thực hiện ngữ nghĩa cho ký hiệu ánh xạ phù hợp với ngữ nghĩa ánh xạ của nó.
Nếu cả hai đầu của tuần tự hóa của bạn sẽ là Python thì tốt hơn bạn nên sử dụng dưa chua. Nếu bạn thực sự cần chuyển đổi những thứ này trở lại từ JSON thành các đối tượng Python nguyên gốc, tôi đoán bạn có một vài lựa chọn. Trước tiên, bạn có thể thử ( try: ... except: ...
) để chuyển đổi bất kỳ khóa nào thành số trong trường hợp lỗi tra cứu từ điển. Ngoài ra, nếu bạn thêm mã vào đầu bên kia (trình tuần tự hóa hoặc trình tạo dữ liệu JSON này) thì bạn có thể yêu cầu nó thực hiện tuần tự hóa JSON trên mỗi giá trị khóa --- cung cấp chúng dưới dạng danh sách các khóa. (Sau đó, mã Python của bạn trước tiên sẽ lặp lại danh sách các khóa, khởi tạo / giải tuần tự chúng thành các đối tượng Python nguyên gốc ... và sau đó sử dụng chúng để truy cập các giá trị ngoài ánh xạ).