Koleksiyona kopyaların eklenmediğinden emin olmak için set
nesneler __hash__
ve __eq__
yöntemler içeren bir Python'um var .
Bu sonucu json kodlamam gerekiyor set
, ancak yönteme bir boş bile set
geçirmek json.dumps
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
json.JSONEncoder
Özel bir default
yöntemi olan sınıf için bir uzantı oluşturabileceğimi biliyorum , ancak set
. set
Varsayı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 set
ve 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 starts
baş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 JSONEncoder
için default
yö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 default
anahtar 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).
dict
s Sanırımlist
setten sadece bir çıkış yapmak ve sonra onu kodlayıcıya geçirmek istiyorsunuz ... örneğin:encode(list(myset))