मेरे पास एक पायथन set
है जिसमें संग्रह में कोई डुप्लीकेट शामिल नहीं होने के लिए __hash__
और __eq__
विधियों वाली ऑब्जेक्ट्स शामिल हैं।JSON serialize सेट कैसे करें?
मैं 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
मानों में से एक शब्दकोश बनाना चाहिए, और फिर उस पर एन्कोडिंग वापस करनी चाहिए? आदर्श रूप में, मैं मूल डेटा एन्कोडर पर सभी डेटाटाइप को संभालने में सक्षम डिफ़ॉल्ट विधि बनाना चाहता हूं (मैं डेटा स्रोत के रूप में मोंगो का उपयोग कर रहा हूं, इसलिए तारीखें भी इस त्रुटि को उठाने लगती हैं)
किसी भी संकेत में सही दिशा की सराहना की जाएगी।
संपादित करें:
जवाब के लिए धन्यवाद! शायद मुझे और सटीक होना चाहिए था।
मैंने set
की सीमाओं के आसपास होने के लिए यहां जवाबों का उपयोग (और ऊपर उठाया) का उपयोग किया है, लेकिन आंतरिक कुंजी भी हैं जो एक समस्या भी हैं।
set
में ऑब्जेक्ट्स जटिल ऑब्जेक्ट्स हैं जो __dict__
पर अनुवाद करती हैं, लेकिन वे स्वयं भी उन गुणों के लिए मूल्य रख सकते हैं जो जेसन एन्कोडर में मूल प्रकारों के लिए अपात्र हो सकते हैं।
इस set
में कई अलग-अलग प्रकार आ रहे हैं, और हैश मूल रूप से इकाई के लिए एक अद्वितीय आईडी की गणना करता है, लेकिन नोएसक्यूएल की सच्ची भावना में बच्चे के ऑब्जेक्ट में बिल्कुल कोई जानकारी नहीं है।
एक ऑब्जेक्ट में starts
के लिए दिनांक मान हो सकता है, जबकि दूसरे में कुछ अन्य स्कीमा हो सकती है जिसमें "गैर-आदिम" ऑब्जेक्ट वाली कोई भी कुंजी शामिल नहीं है।
यही कारण है कि एकमात्र समाधान जिसे मैं सोच सकता था JSONEncoder
को default
विधि को अलग-अलग मामलों को चालू करने के लिए विस्तारित करना था - लेकिन मुझे यकीन नहीं है कि इस बारे में कैसे जाना है और दस्तावेज़ीकरण संदिग्ध है। नेस्टेड ऑब्जेक्ट्स में, क्या default
से लौटाया गया मान कुंजी से जाता है, या क्या यह सिर्फ एक सामान्य शामिल है/हटा देता है जो पूरे ऑब्जेक्ट को देखता है? यह विधि नेस्टेड मानों को कैसे समायोजित करती है? मैंने पिछले प्रश्नों को देखा है और केस-विशिष्ट एन्कोडिंग के लिए सबसे अच्छा तरीका नहीं लग रहा है (जो दुर्भाग्य से ऐसा लगता है कि मुझे यहां क्या करने की आवश्यकता है)।
क्यों 'dict's? मुझे लगता है कि आप सेट से सिर्फ 'सूची' बनाना चाहते हैं और फिर इसे एन्कोडर में पास करना चाहते हैं ... उदाहरण: 'एनकोड (सूची (माइसेट))' – Constantinius
जेएसओएन का उपयोग करने के बजाय, आप वाईएएमएल का उपयोग कर सकते हैं (JSON अनिवार्य रूप से है वाईएएमएल का सबसेट)। –
@PaoloMoretti: हालांकि यह कोई फायदा लाता है?मुझे नहीं लगता कि सेट वाईएएमएल के सार्वभौमिक रूप से समर्थित डेटा प्रकारों में से हैं, और यह विशेष रूप से एपीआई के संबंध में कम व्यापक रूप से समर्थित है। – delnan