Tôi có một Python set
chứa các đối tượng __hash__
và __eq__
phương thức để đảm bảo không có bản sao nào được đưa vào bộ sưu tập.
Tôi cần json mã hóa kết quả này set
, nhưng chuyển ngay cả một khoảng trống set
cho json.dumps
phương thức tăng a TypeError
.
File "/usr/lib/python2.7/json/encoder.py", line 201, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/usr/lib/python2.7/json/encoder.py", line 264, in iterencode
return _iterencode(o, 0)
File "/usr/lib/python2.7/json/encoder.py", line 178, in default
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: set([]) is not JSON serializable
Tôi biết tôi có thể tạo một phần mở rộng cho json.JSONEncoder
lớp có default
phương thức tùy chỉnh , nhưng tôi thậm chí không chắc bắt đầu chuyển đổi qua đâu set
. Tôi có nên tạo một từ điển trong số các set
giá trị trong phương thức mặc định và sau đó trả lại mã hóa trên đó không? Lý tưởng nhất là tôi muốn làm cho phương thức mặc định có thể xử lý tất cả các kiểu dữ liệu mà bộ mã hóa ban đầu mắc phải (Tôi đang sử dụng Mongo làm nguồn dữ liệu để ngày cũng có thể gây ra lỗi này)
Bất kỳ gợi ý theo đúng hướng sẽ được đánh giá cao.
BIÊN TẬP:
Cảm ơn câu trả lời! Có lẽ tôi nên chính xác hơn.
Tôi đã sử dụng (và nâng cấp) các câu trả lời ở đây để khắc phục những hạn chế của việc set
dịch, nhưng có những khóa nội bộ cũng là một vấn đề.
Các đối tượng trong set
là các đối tượng phức tạp dịch sang __dict__
, nhưng bản thân chúng cũng có thể chứa các giá trị cho các thuộc tính của chúng có thể không đủ điều kiện cho các loại cơ bản trong bộ mã hóa json.
Có rất nhiều loại khác nhau xuất hiện set
và hàm băm tính toán một id duy nhất cho thực thể, nhưng theo tinh thần thực sự của NoQuery thì không thể nói chính xác đối tượng con chứa gì.
Một đối tượng có thể chứa giá trị ngày cho starts
, trong khi một đối tượng khác có thể có một số lược đồ khác không chứa khóa nào chứa các đối tượng "không nguyên thủy".
Đó là lý do tại sao giải pháp duy nhất tôi có thể nghĩ đến là mở rộng phương pháp JSONEncoder
thay thế default
phương thức để bật các trường hợp khác nhau - nhưng tôi không chắc chắn làm thế nào để giải quyết vấn đề này và tài liệu không rõ ràng. Trong các đối tượng lồng nhau, giá trị được trả về từ default
go by key, hay nó chỉ là một bao gồm / loại bỏ chung nhìn vào toàn bộ đối tượng? Làm thế nào để phương pháp đó chứa các giá trị lồng nhau? Tôi đã xem qua các câu hỏi trước đây và dường như không thể tìm ra cách tiếp cận tốt nhất cho mã hóa theo trường hợp cụ thể (điều không may là dường như những gì tôi sẽ cần phải làm ở đây).
dict
vậy Tôi nghĩ rằng bạn muốn tạo ra một bộlist
ngoài và sau đó chuyển nó cho bộ mã hóa ... ví dụ:encode(list(myset))