मुख्य मूल्य जोड़े के लिए JSON संरचना क्या है?


23

मुख्य मूल्य जोड़े के लिए JSON प्रारूप क्या बेहतर विकल्प है और क्यों?

[{"key1": "value1"}, {"key2": "value2"}]

या:

[{"Name": "key1", "Value": "value1"}, {"Name": "key2", "Value": "value2"}]

या:

{"key1": "value1", "key2": "value2"}

पहला संस्करण अधिक कॉम्पैक्ट और अधिक "शब्दार्थ अर्थपूर्ण" लगता है। दूसरा संस्करण अधिक समान रूप से संरचित लगता है जो इसे संसाधित करने में मदद कर सकता है। तीसरा संस्करण और भी अधिक अर्थपूर्ण लगता है।

प्रमुख मूल्य जोड़े का उपयोग किसी अन्य आइटम के लिए मनमाना डेटा संलग्न करने के लिए किया जाएगा। डेटा को JSON के रूप में क्रमांकित किया जाना चाहिए ताकि इसे सिस्टम के माध्यम से राउंड-टिप किया जा सके।


3
जब तक आपको आदेश देने की आवश्यकता नहीं होती, तब तक विचार क्यों नहीं किया जाता {"key1": "value1", "key2": "value2"}?
kennytm

4
JSON पहले से ही एक (नेस्टेबल) शब्दकोश है।
कासे स्पीकमैन

1
आपकी समस्या का वर्णन यह कहने के लिए पर्याप्त है कि उन स्वरूपों में से कोई भी काम करेगा, और असली सवाल यह है कि इसे उपभोग करने के लिए सरल कैसे बनाया जाए, जो इस बात पर निर्भर करता है कि प्रौद्योगिकी ग्राहक क्या उपयोग करते हैं।
पटकथा

आपको सबसे सरल का उपयोग करना चाहिए जो आपकी आवश्यकताओं को पूरा करता है, उम्मीद है कि सरल ऑब्जेक्ट फॉर्म (# 3) होगा। हालाँकि, यदि आप और भी अधिक विकल्पों की तलाश में हैं, तो आप समानांतर में दो सरणियों का उपयोग कर सकते हैं, एक कुंजी के लिए, और एक मान के लिए; वस्तु कुंजियों और डुप्लिकेट कुंजियों (जो # 3 के साथ समर्थित नहीं होगी) का समर्थन करते हुए भी बहुत अधिक कॉम्पैक्ट होगा।
एरिक इद्दत

जवाबों:


10

चाहे आप पहला या तीसरा विकल्प चुनते हैं, आपके उपयोग के मामले पर निर्भर करता है। यदि आप एक ही प्रकार के कई अलग-अलग उदाहरणों को मॉडलिंग कर रहे हैं, तो पहले चुनें। उदाहरण के लिए, आप लोगों की एक सूची है। यदि आप एक चीज के कई अलग-अलग गुणों को मॉडलिंग कर रहे हैं, तो तीसरा चुनें। आपके पास पहले प्रारूप में चाबियाँ दोहराई जा सकती हैं, लेकिन तीसरे में नहीं।

दूसरा विकल्प भयानक है, और मुझे अभी तक इसके लिए एक उपयुक्त उपयोग का मामला नहीं मिला है। कारण यह भयानक है, और अधिक क्रिया होने के अलावा, एकल-स्तर JSON के लिए, यह अधिकांश पुस्तकालयों के शब्दकोश / मानचित्र में स्वचालित रूपांतरण को तोड़ता है। डीप-नेस्टेड JSON के लिए, यह XPath-like क्वेरी इंटरफ़ेस को तोड़ता है।

यह इसके साथ काम करने के लिए एक दर्द बनाता है। और यदि आप संकलन समय पर अपनी कुंजियों को नहीं जानते हैं, तो आप एक शब्दकोश या XPath इंटरफ़ेस चाहते हैं, क्योंकि आप इसे कक्षा में परिवर्तित नहीं कर पाएंगे। यह अब एक बड़ी बात नहीं हो सकती है, लेकिन अब आपके पास एक डेटा प्रारूप है, इसे बदलना जितना कठिन होगा।


5
दूसरे विकल्प का बड़ा लाभ यह है कि यह गैर-स्ट्रिंग कुंजी के साथ काम करता है, विशेष रूप से समग्र कुंजी में।
कोडइंचोज

1
दूसरा विकल्प भयानक है और आपको अभी तक उपयोग के मामले का पता लगाना है? कई कुंजी / मान जोड़े के साथ शब्दकोशों का सरणी कई वस्तुओं को प्रसारित करने के लिए सबसे सामान्य प्रारूप के बारे में होना चाहिए।
gnasher729

2
@ gnasher729, आपके "सबसे सामान्य प्रारूप" मामले में असली कुंजी सभी बाईं ओर हैं [{"key1": "value1", "key2": "value2"}]:। यहाँ दूसरा प्रारूप वास्तविक कुंजी को दाईं ओर रख रहा है, और आपको असली कुंजी को इंगित करने के लिए "नाम" नामक एक अन्य कुंजी का उपयोग कर रहा है, जिससे मानक टूल के साथ पार्स करना बेहद मुश्किल है।
कार्ल बेवेलफेल्ट

मैं तुम्हें एक, @CodesInChaos दूंगा। हालांकि, वहाँ भी, यह एक बहुत ही खास मामला होगा। मैंने जंगली में इसकी आवश्यकता को कभी नहीं देखा है।
कार्ल बेवफेल्ट

3
क्षमा करें, लेकिन यह एक बुरा जवाब है। दूसरा विकल्प बहुत ही सामान्य रूप से उपयोग और सलाह दोनों है। यह कुंजियों के लचीलेपन के लिए अनुमति देता है, यह उपभोक्ताओं को तोड़ने के बिना विस्तार (अधिक मूल्य / मेटाडेटा क्षेत्रों के साथ) की अनुमति देता है, और यह तत्व आदेश को संरक्षित कर सकता है। साथ ही, दिए गए कारण फर्जी हैं: यह किसी भी "स्वचालित रूपांतरण" को नहीं तोड़ता है (यह केवल लेखक की प्रस्तुति को सरणी के रूप में सम्मानित करता है) और यह XPath-like क्वेरी इंटरफ़ेस के साथ ठीक काम करता है। केवल नकारात्मक पक्ष वृद्धि की क्रिया है।
हज्जाज़मैन

5

तीसरा प्रारूप सामान्य रूप से सबसे अच्छा है। हालाँकि, यहाँ 1 प्रारूप के लिए उपयुक्त कुछ का एक उदाहरण है:

[{
  "username": "foo",
  "id": 1
}, {
  "username": "bar",
  "id": 2
}, {
  "username": "baz",
  "id": 3
}]

यहाँ प्रत्येक ऑब्जेक्ट एक अलग चीज़ को संदर्भित करता है (और प्रत्येक ऑब्जेक्ट अन्य की तरह ही कुंजियों का उपयोग करता है, इसलिए उन्हें विलय नहीं किया जा सकता है)। हालाँकि, सूची में प्रत्येक वस्तु को { "username": "foo", "id": 1 }इसके बजाय संग्रहीत किया गया है [{ "username": "foo" }, { "id": 1 }]क्योंकि 1) यह छोटा है और 2) यह एक उपयोगकर्ता नाम और आईडी के साथ एक चीज का संदर्भ दे रहा है, एक उपयोगकर्ता नाम के साथ एक चीज और एक आईडी के साथ दूसरी चीज नहीं है।

दूसरे विकल्प के साथ समस्या यह है कि यह JSON के रूप में और साथ काम करने के लिए बहुत ही क्रियात्मक हो जाता है। हालांकि, इसका उपयोग किया जा सकता है यदि आपको संपत्ति के बारे में मेटा-जानकारी संग्रहीत करने की आवश्यकता है। एक उदाहरण:

{
  "key": "foo",
  "value": 1,
  "mutable": true
}

यहां mutableएक काल्पनिक मामले का उल्लेख है कि क्या आप संपत्ति को स्वयं संशोधित कर सकते हैं, न कि मूल वस्तु को। इस तरह की मेटा-जानकारी जावास्क्रिप्ट के समान है Object.defineProperty, जो एक संपत्ति के बारे में "कॉन्फ़िगर करने योग्य", "गणना करने योग्य" और "लिखने योग्य" जानकारी संग्रहीत करता है।


मैं कुछ JSON मैं C # REST अंतिम बिंदु पर भेज रहा था और यह किसी शब्दकोश ऑब्जेक्ट में परिवर्तित नहीं हो रहा था, के लिए पहले प्रारूप का उपयोग करने की कोशिश कर रहा था। 3 प्रारूप में बदलने से यह साफ हो गया कि
fizch

5

आप कहते हैं कि ये कुंजी / मूल्य जोड़े हैं। उस स्थिति में, # 3: कुंजी / मान जोड़े के शब्दकोश का उपयोग करें।

इन कर रहे हैं नहीं कुंजी / मान जोड़े, तो उन्हें "कुंजी" और "मूल्यों" कहते हैं और # 2, मनमाने ढंग से सामग्री के साथ शब्दकोशों की एक सरणी का उपयोग नहीं करते।

जब तक आपको कुंजी / मूल्य जोड़े की आवश्यकता नहीं है, तब तक संरचना # 1 सिर्फ सही है। जो आप शायद ही करते हों।


3

json प्राप्त करने वाले व्यक्ति के जूते में अपने आप रखो। अगर मुझे मुख्य नाम नहीं पता है कि मैं इसे पहले या अंतिम प्रारूप के साथ कैसे प्राप्त करूं? आप निश्चित रूप से json के माध्यम से लूप कर सकते हैं लेकिन चूंकि सभी तीन प्रारूप समान परिणाम प्राप्त करते हैं, इसलिए यह सिंटैक्स का सवाल है। मुझे लगता है कि यह केवल सार्थक सवाल यह है: अगर आप कुंजी नाम पता प्रथम या अंतिम विकल्प है, और अधिक कॉम्पैक्ट हैं नहीं तो दूसरा विकल्प अधिक समझा जा सकता है।

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