Koleksiyona kopyaların eklenmediğinden emin olmak için setnesneler __hash__ve __eq__yöntemler içeren bir Python'um var .
Bu sonucu json kodlamam gerekiyor set, ancak yönteme bir boş bile setgeçirmek json.dumpsa 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
json.JSONEncoderÖzel bir defaultyöntemi olan sınıf için bir uzantı oluşturabileceğimi biliyorum , ancak set. setVarsayılan yöntemdeki değerlerden bir sözlük oluşturmalı ve ardından bunun üzerine kodlamayı döndürmeli miyim? İdeal olarak, varsayılan yöntemin, orijinal kodlayıcının tıkandığı tüm veri türlerini işleyebilmesini sağlamak istiyorum (Mongo'yu bir veri kaynağı olarak kullanıyorum, bu nedenle tarihler de bu hatayı artırıyor gibi görünüyor)
Doğru yönde herhangi bir ipucu takdir edilecektir.
DÜZENLE:
Cevap için teşekkürler! Belki de daha kesin olmalıydım.
Çevrilenin sınırlamalarını aşmak için buradaki cevapları kullandım (ve yükselttim) set, ancak bir sorun olan dahili anahtarlar da var.
İçindeki nesneler set, çevrilen karmaşık nesnelerdir __dict__, ancak kendileri de özellikleri için json kodlayıcısındaki temel türler için uygun olmayan değerler içerebilir.
Buna giren birçok farklı tür var setve karma temelde varlık için benzersiz bir kimlik hesaplıyor, ancak NoSQL'in gerçek ruhunda, alt nesnenin tam olarak ne içerdiğini söylemek mümkün değil.
Bir nesne için bir tarih değeri içerebilirken, bir startsbaşkası "ilkel olmayan" nesneler içeren anahtar içermeyen başka bir şemaya sahip olabilir.
Bu yüzden düşünebildiğim tek çözüm , farklı vakaları açmak JSONEncoderiçin defaultyöntemi değiştirmek için genişletmekti - ancak bunun nasıl yapılacağından emin değilim ve dokümantasyon belirsiz. Yuvalanmış nesnelerde, go'dan defaultanahtar tarafından döndürülen değer mi yoksa tüm nesneye bakan genel bir dahil etme / çıkarma işlemi mi? Bu yöntem iç içe geçmiş değerleri nasıl barındırır? Önceki soruları inceledim ve duruma özel kodlamaya en iyi yaklaşımı bulamıyorum (ki bu maalesef burada yapmam gereken şey gibi görünüyor).
dicts Sanırımlistsetten sadece bir çıkış yapmak ve sonra onu kodlayıcıya geçirmek istiyorsunuz ... örneğin:encode(list(myset))