JSON में सेट का प्रतिनिधित्व कैसे करें?


16

JSON निम्नलिखित डेटा संरचनाओं (जावा समकक्ष) का समर्थन करता है: स्केलर, एरे / सूची और मानचित्र।

SetJSON में ए -आउट-द-बॉक्स समर्थित नहीं है।

मैंने JSON में एक सेट का प्रतिनिधित्व करने के कई तरीकों के बारे में सोचा:

[१] - एक सूची के रूप में

हालाँकि, एक सूची का अपना क्रम होता है, इसलिए निम्नलिखित दो सूचियाँ, ["a", "b"]और ["b", "a"]सूचियों के बराबर नहीं हैं, लेकिन वे सेट के बराबर होनी चाहिए।

[२] - नक्शे के रूप में

मानचित्र के कुंजी-सेट का उपयोग करें, और मूल्यों को अनदेखा करें।

लेकिन फिर से, मानक तुलना का उपयोग करते हुए, दो नक्शे के समान नहीं हैं:

{"a": "foo", "b": "bar"}, {"a": null, "b": null}

[३] - एक मानचित्र के रूप में, एक विशेष मूल्य के साथ

एक स्केलर लें, कहें 0या nullइसे मानचित्र में हर कुंजी का मान होने के लिए मजबूर करें:

{"a": 0, "b": 0}

इस तरह, मानक तुलना टूल के तहत, ऑब्जेक्ट समान होते हैं, भले ही कुंजी क्रम बदल दिया गया हो।

हालाँकि, यह तकनीक अप्रासंगिक डेटा के साथ JSON दस्तावेज़ को प्रदूषित करती है।

[४] - एक आदेशित सूची के रूप में

पहले सुझाव पर वापस जाएं, लेकिन इस बार एक आदेशित सूची के रूप में। इस तरह की तुलना समस्या को हल करती है।

हालांकि, हमें छंटाई की जटिलता को भी ध्यान में रखना चाहिए, और यह भी कि मानचित्र संकेतन डुप्लिकेट को संभालता है, जबकि एक क्रमबद्ध सूची नहीं है। उदाहरण:

{"a": 400, "a": 9}के रूप में संभाला है {"a": 9}, लेकिन ["g", "g"]हमेशा रहेगा ["g", "g"]

यह सब कहने के बाद, यह मुझे लगता है कि सूची संकेतन स्पष्ट है, लेकिन मानचित्र संकेतन कुंजी दोहराव के लिए अधिक मजबूत है, और विशेष मूल्य के बारे में सुसंगत होना कठिन बना देता है (भले ही उसके nullलिए एक अच्छा विकल्प जैसा लगता है)।

तुम क्या सोचते हो? आप JSON में एक सेट का प्रतिनिधित्व कैसे करेंगे?

पुनश्च

ध्यान दें कि यह सवाल केवल JSON के बारे में है। मुझे पता है कि यमल जैसे अन्य प्रारूप उपलब्ध हैं। फिर भी...


1
सेट JSON द्वारा समर्थित नहीं हैं, यह दायरे से बाहर है। एक सेट, या एक विशिष्ट, अद्वितीय संग्रह, एप्लिकेशन के दायरे में मौजूद है। क्योंकि यह एक संग्रह है, इसलिए संग्रह सिंटैक्स का उपयोग करना अधिक स्पष्ट होगा।
ज़ीमस

1
आप JSON में सेट का प्रतिनिधित्व क्यों करना चाहेंगे? याद रखें JSON एक विनिमय प्रारूप है।
एंड्रेस एफ।

@AndresF। मैंने सोचा कि मूल्यों की विशिष्टता को व्यक्त करना एक अच्छा विचार होगा। मैं JSON को केवल विनिमय प्रारूप में नहीं बांधूंगा। यह दस्तावेज़ भंडारण के लिए भी उपयोगी हो सकता है (जैसे MongoDB में)।
रॉन क्लेन

@ रॉनकेलिन मेला काफी लेकिन ऊ ... मुझे MongoDB के साथ शुरू नहीं करना चाहिए: पी
एंड्रेस एफ।

YAML में, सेटों को आपके विकल्प [3] के रूप में दर्शाया जाता है, लेकिन इसमें विशेष संकेतन है कि JSON नहीं है।
Jasmijn

जवाबों:


21

खैर, आप नहीं कर सकते। जैसा कि आपने कहा, आप सरणियों और शब्दकोशों का प्रतिनिधित्व कर सकते हैं। आपके पास दो विकल्प हैं।

एक सरणी के रूप में सेट का प्रतिनिधित्व करें। लाभ: सेट से एरे और बैक में परिवर्तित करना आमतौर पर आसान होता है। नुकसान: एक सरणी में एक निहित आदेश होता है, जो एक सेट नहीं होता है, इसलिए समान सेट को JSON सरणियों में परिवर्तित करने से सरणियों का निर्माण हो सकता है जिन्हें अलग माना जाएगा। इस बात को लागू करने का कोई तरीका नहीं है कि सरणी तत्व अद्वितीय हैं, इसलिए JSON सरणी में एक वैध सेट नहीं हो सकता है (जाहिर है कि आप केवल डुप्लिकेट को अनदेखा कर सकते हैं, यही है, वैसे भी होने की संभावना है)।

प्रति के लिए एक मनमाना मूल्य के साथ एक शब्दकोश के रूप में सेट का प्रतिनिधित्व करें, उदाहरण के लिए 0 या अशक्त। यदि आप सिर्फ मूल्यों की अनदेखी करते हैं, तो यह एक आदर्श मैच है। दूसरी ओर, आपके पास किसी शब्दकोश की कुंजियों को एक समुच्चय के रूप में निकालने के लिए, या किसी कोश को शब्दकोश में बदलने के लिए कोई पुस्तकालय समर्थन नहीं हो सकता है।

मेरे प्रोग्रामिंग वातावरण में, सेट और सरणी के बीच रूपांतरण आसान है (सेट करने के लिए सरणी डुप्लिकेट मान खो देगी, जो या तो वहां नहीं होनी चाहिए, या सही माना जाएगा), इसलिए उस कारण से मैं सरणियों के साथ जाऊंगा। लेकिन यह बहुत अधिक राय का विषय है।

लेकिन: कमरे में एक बड़ा मोटा हाथी है जिसका उल्लेख नहीं किया गया है। एक JSON शब्दकोश में चाबियाँ केवल तार हो सकती हैं। यदि आपका सेट स्ट्रिंग्स का सेट नहीं है, तो आपके पास केवल एक सरणी का उपयोग करने का विकल्प है।


5
गैर-तार के किनारे का मामला एक शब्दकोश के खिलाफ एक अच्छा तर्क है।
रॉन क्लेन

4

JSON में सेट का प्रतिनिधित्व करने की कोशिश मत करो। इसके बजाय डेटा पार्स करते समय करें।

आपके JSON डेटा में एक स्कीमा होना चाहिए जो निर्दिष्ट करता है कि कौन से फ़ील्ड्स को एक सेट के रूप में माना जाना चाहिए, या आपके पास JSON डेटा में ही मेटाडेटा एम्बेडेड हो सकता है जो बताता है कि सूची को सेट के रूप में माना जाना चाहिए (जैसे {"houses": {"_type": "set", "value": [...]}}) या नामकरण सम्मेलन के साथ।

ध्यान दें कि JSON मानक के अनुसार, JSON ऑब्जेक्ट में डुप्लिकेट कुंजियाँ हो सकती हैं। ECMA-404 शब्द:

वस्तुओं

[...] JSON सिंटैक्स नाम के रूप में उपयोग किए गए स्ट्रिंग्स पर कोई प्रतिबंध नहीं लगाता है, इसके लिए नाम स्ट्रिंग्स अद्वितीय होने की आवश्यकता नहीं है, और नाम / मान जोड़े के क्रम के लिए कोई महत्व नहीं देता है। ये सभी अर्थ संबंधी विचार हैं जिन्हें JSON प्रोसेसर द्वारा या डेटा इंटरचेंज के लिए JSON के विशिष्ट उपयोगों को परिभाषित करने वाली विशिष्टताओं में परिभाषित किया जा सकता है।

AFAICD, गैर-विशिष्ट नामों की कल्पना के लिए कुछ भी निषिद्ध नहीं है, और कई JSON पार्सर कार्यान्वयन हैं जो गैर अद्वितीय ऑब्जेक्ट नामों को पार्स कर सकते हैं। RFC 7159 इंटरऑपरेबिलिटी के लिए गैर-अद्वितीय नामों को हतोत्साहित करता है, लेकिन विशेष रूप से इसे या तो मना नहीं करता है, और यह सूची में जाता है कि कैसे विभिन्न पार्सर्स को गैर-अद्वितीय ऑब्जेक्ट नामों को संभालते हुए देखा गया है।

और ECMA 404 को यह भी आवश्यक नहीं है कि सरणी क्रम को संरक्षित रखा जाए:

Arrays

JSON सिंटैक्स मूल्यों के क्रम के लिए किसी विशिष्ट अर्थ को परिभाषित नहीं करता है। हालांकि, JSON सरणी संरचना अक्सर उन स्थितियों में उपयोग की जाती है जहां ऑर्डर करने के लिए कुछ शब्दार्थ है।

यह शब्दांकन, यदि वे ऐसा चुनते हैं, तो अनुप्रयोगों को सेट का प्रतिनिधित्व करने के लिए सरणियों का उपयोग करने की अनुमति देता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.