Saya memiliki Python set
yang berisi objek __hash__
dan __eq__
metode untuk memastikan tidak ada duplikat yang disertakan dalam koleksi.
Saya perlu json menyandikan hasil ini set
, tetapi melewati bahkan kosong set
ke json.dumps
metode menimbulkan 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
Saya tahu saya dapat membuat ekstensi ke json.JSONEncoder
kelas yang memiliki default
metode khusus , tapi saya bahkan tidak yakin harus mulai dari mana untuk mengkonversi set
. Haruskah saya membuat kamus dari set
nilai - nilai dalam metode default, dan kemudian mengembalikan pengkodean itu? Idealnya, saya ingin membuat metode default dapat menangani semua tipe data yang disandikan oleh pembuat kode asli (Saya menggunakan Mongo sebagai sumber data sehingga tanggal tampaknya juga meningkatkan kesalahan ini)
Setiap petunjuk ke arah yang benar akan dihargai.
EDIT:
Terima kasih atas jawabannya! Mungkin saya seharusnya lebih tepat.
Saya menggunakan (dan meningkatkan) jawaban di sini untuk mengatasi keterbatasan set
terjemahan, tetapi ada kunci internal yang menjadi masalah juga.
Objek dalam objek set
kompleks yang diterjemahkan __dict__
, tetapi mereka sendiri juga dapat berisi nilai untuk properti mereka yang bisa tidak memenuhi syarat untuk tipe dasar dalam json encoder.
Ada banyak jenis berbeda yang masuk ke dalam ini set
, dan hash pada dasarnya menghitung id unik untuk entitas, tetapi dalam semangat sejati NoSQL tidak ada yang tahu persis apa isi objek anak.
Satu objek mungkin berisi nilai tanggal untuk starts
, sedangkan yang lain mungkin memiliki beberapa skema lain yang tidak menyertakan kunci yang berisi objek "non-primitif".
Itulah sebabnya satu-satunya solusi yang dapat saya pikirkan adalah memperpanjang JSONEncoder
untuk mengganti default
metode untuk menghidupkan kasus yang berbeda - tapi saya tidak yakin bagaimana cara melakukannya dan dokumentasi ini ambigu. Dalam objek bersarang, apakah nilai yang dikembalikan dari default
pergi dengan kunci, atau hanya menyertakan / membuang umum yang melihat seluruh objek? Bagaimana metode itu mengakomodasi nilai bersarang? Saya telah memeriksa pertanyaan-pertanyaan sebelumnya dan sepertinya tidak dapat menemukan pendekatan terbaik untuk pengkodean spesifik kasus (yang sayangnya sepertinya perlu saya lakukan di sini).
dict
? Saya pikir Anda ingin membuat hanyalist
dari set dan kemudian meneruskannya ke encoder ... misalnya:encode(list(myset))