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