ฉันมีงูหลามsetที่มีวัตถุด้วย__hash__และ__eq__วิธีการเพื่อให้แน่ใจว่าไม่มีการซ้ำซ้อนจะรวมอยู่ในคอลเลกชัน
ฉันจำเป็นต้องเข้ารหัส JSON ผลนี้setแต่ผ่านแม้ที่ว่างเปล่าsetกับวิธีการยกjson.dumpsTypeError
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ระดับที่มีกำหนดเองdefaultวิธี setแต่ผมไม่แน่ใจว่าจะเริ่มต้นในการแปลงมากกว่า ฉันควรสร้างพจนานุกรมจากsetค่าภายในวิธีการเริ่มต้นแล้วส่งคืนการเข้ารหัสที่? เป็นการดีที่ฉันต้องการให้วิธีการเริ่มต้นสามารถจัดการกับประเภทข้อมูลทั้งหมดที่ตัวเข้ารหัสดั้งเดิมทำให้เกิด (ฉันใช้ Mongo เป็นแหล่งข้อมูลดังนั้นวันที่ดูเหมือนจะทำให้เกิดข้อผิดพลาดนี้ด้วย)
คำแนะนำใด ๆ ในทิศทางที่ถูกต้องจะได้รับการชื่นชม
แก้ไข:
ขอบคุณสำหรับคำตอบ! บางทีฉันควรจะแม่นยำมากขึ้น
ฉันใช้ประโยชน์ (และเพิ่มขึ้น) คำตอบที่นี่เพื่อแก้ไขข้อ จำกัด ของsetการแปล แต่มีคีย์ภายในที่เป็นปัญหาเช่นกัน
วัตถุในนั้นsetเป็นวัตถุที่ซับซ้อนที่แปลไป__dict__แต่พวกมันเองยังสามารถมีค่าสำหรับคุณสมบัติของพวกเขาที่อาจไม่เหมาะสมสำหรับประเภทพื้นฐานในตัวเข้ารหัส json
มีหลายประเภทที่เข้ามาในนี้setและแฮโดยทั่วไปจะคำนวณรหัสที่ไม่ซ้ำกันสำหรับเอนทิตี แต่ในจิตวิญญาณที่แท้จริงของ NoSQL ไม่มีการบอกสิ่งที่วัตถุลูกมี
วัตถุหนึ่งอาจมีค่าวันstartsที่ในขณะที่อีกวัตถุหนึ่งอาจมีสคีมาอื่น ๆ ที่ไม่มีคีย์ที่มีวัตถุ "ที่ไม่ใช่แบบดั้งเดิม"
นั่นคือเหตุผลที่ทางออกเดียวที่ฉันคิดได้คือขยายวิธีJSONEncoderการเปลี่ยนdefaultวิธีการเปิดกรณีที่แตกต่างกัน - แต่ฉันไม่แน่ใจว่าจะทำอย่างไรและเอกสารมีความคลุมเครือ ในวัตถุที่ซ้อนกันค่าที่ส่งคืนจากการdefaultไปตามคีย์หรือเป็นเพียงแค่การรวม / ทิ้งทั่วไปที่มองที่วัตถุทั้งหมดหรือไม่ วิธีนั้นรองรับค่าที่ซ้อนกันได้อย่างไร ฉันได้อ่านคำถามก่อนหน้านี้แล้วและไม่สามารถหาวิธีที่ดีที่สุดในการเข้ารหัสเฉพาะกรณี (ซึ่งน่าเสียดายที่ฉันต้องทำที่นี่)
dictS? ฉันคิดว่าคุณต้องการสร้างlistออกมาจากชุดแล้วส่งไปยังตัวเข้ารหัส ... เช่น:encode(list(myset))