क्या JSON सूची में तत्वों का क्रम संरक्षित है?


254

मैंने पाया है कि JSON ऑब्जेक्ट में तत्वों का क्रम मूल क्रम नहीं है।

JSON सूचियों के तत्वों के बारे में क्या? क्या उनका क्रम बना हुआ है?

जवाबों:


370

हां, JSON सरणियों में तत्वों का क्रम संरक्षित है। से आरएफसी 7159 -इस जावास्क्रिप्ट ऑब्जेक्ट नोटेशन (JSON) डाटा इंटरचेंज फ़ॉर्मेट (जोर मेरा):

एक वस्तु शून्य या अधिक नाम / मूल्य जोड़े का एक अनियंत्रित संग्रह है, जहां एक नाम एक स्ट्रिंग है और एक मूल्य एक स्ट्रिंग, संख्या, बूलियन, अशक्त, वस्तु या सरणी है।

एक सरणी शून्य या अधिक मानों का एक क्रमबद्ध क्रम है।

"ऑब्जेक्ट" और "एरे" शब्द जावास्क्रिप्ट के सम्मेलनों से आते हैं।

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


हालाँकि, मैंने कुछ डेवलपर्स से बात की है, जिन्हें समस्याओं का सामना करना पड़ा है, जहाँ सरणियों का आदेश नहीं दिया गया है। Ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf में इस अजीब से शब्दों के पारित होने पर एक नज़र डालें । JSON सिंटैक्स मूल्यों के क्रम के लिए किसी विशिष्ट अर्थ को परिभाषित नहीं करता है। हालांकि, JSON सरणी संरचना अक्सर उन स्थितियों में उपयोग की जाती है जहां ऑर्डर करने के लिए कुछ शब्दार्थ होता है। '
काटो

73

किसी सरणी में तत्वों का क्रम बना हुआ []है। तत्वों का क्रम (नाम: मूल्य जोड़े) एक "ऑब्जेक्ट" ( {}) में नहीं है, और यह सामान्य रूप से उनके लिए "जंबल्ड" है, यदि JSON फॉर्मेटर / पार्सर द्वारा स्वयं नहीं तो भाषा-विशिष्ट ऑब्जेक्ट्स (शब्दकोश,) द्वारा एनएसडॉर, हैशटेबल, आदि) जो आंतरिक प्रतिनिधित्व के रूप में उपयोग किए जाते हैं।


7

व्यावहारिक रूप से, यदि चाबियाँ टाइप NaN की थीं, तो ब्राउज़र ऑर्डर नहीं बदलेगा।

निम्न स्क्रिप्ट "एक", "दो", "तीन" का उत्पादन करेगी:

var foo={"3":"Three", "1":"One", "2":"Two"};
for(bar in foo) {
    alert(foo[bar]);
}

जबकि निम्नलिखित स्क्रिप्ट "तीन", "एक", "दो" का उत्पादन करेगी:

var foo={"@3":"Three", "@1":"One", "@2":"Two"};
for(bar in foo) {
    alert(foo[bar]);
}

16
लेकिन यह JSON की ओर से अपरिभाषित व्यवहार पर निर्भर है। आपके साथ जो भी संभोग करता है उसका व्यवहार समान नहीं हो सकता है।
हॉट लिक्स

3
यह उत्तर किसी वस्तु पर चर्चा करता है। सवाल "सूची" से संबंधित है, जिसे केवल औसत सरणी से अनुमान लगाया जा सकता है, जिसे शब्दार्थ विनिर्देश द्वारा आदेश दिया गया है (जेरेमी का जवाब देखें)।
टॉम

5

कुछ जावास्क्रिप्ट इंजन प्रविष्टि क्रम में चाबियाँ रखते हैं। उदाहरण के लिए, V8 उन कुंजियों के क्रम में सभी कुंजियों को रखता है , जिन्हें बिना छोड़े हुए 32-बिट पूर्णांक के रूप में पार्स किया जा सकता है

इसका मतलब है कि यदि आप निम्नलिखित में से किसी एक को चलाते हैं:

var animals = {};
animals['dog'] = true;
animals['bear'] = true;
animals['monkey'] = true;
for (var animal in animals) {
  if (animals.hasOwnProperty(animal)) {
    $('<li>').text(animal).appendTo('#animals');
  }
}
var animals = JSON.parse('{ "dog": true, "bear": true, "monkey": true }');
for (var animal in animals) {
  $('<li>').text(animal).appendTo('#animals');
}

आपको Chrome पर कुत्ते , भालू और बंदर लगातार मिलेंगे , जो V8 का उपयोग करता है। Node.js भी V8 का उपयोग करता है। यह तब भी सही होगा जब आपके पास हजारों आइटम होंगे। YMMV अन्य जावास्क्रिप्ट इंजनों के साथ।

यहाँ और यहाँ डेमो ।


7
लेकिन यह JSON की ओर से अपरिभाषित व्यवहार पर निर्भर है। आपके साथ जो भी संभोग करता है उसका व्यवहार समान नहीं हो सकता है।
हॉट लिक्स

1

"क्या JSON सूची में तत्वों का क्रम बना हुआ है?" अच्छा सवाल नहीं है। आपको यह पूछने की आवश्यकता है "क्या एक JSON सूची में तत्वों का क्रम बनाए रखते हुए [...]?" जैसा कि फेलिक्स किंग ने बताया, JSON एक टेक्स्ट डेटा प्रारूप है। यह एक कारण के बिना उत्परिवर्तित नहीं करता है। (जावास्क्रिप्ट) ऑब्जेक्ट के साथ JSON स्ट्रिंग को भ्रमित न करें।

आप शायद संचालन के बारे में बात कर रहे हैं जैसे JSON.stringify(JSON.parse(...))। अब इसका उत्तर है: यह कार्यान्वयन पर निर्भर करता है। JSON के 99% * पार्सर्स ऑब्जेक्ट्स के ऑर्डर को बनाए नहीं रखते हैं, और सरणियों के ऑर्डर को बनाए रखते हैं, लेकिन आप JSON का उपयोग किसी चीज़ को स्टोर करने के लिए भी कर सकते हैं

{
    "son": "David",
    "daughter": "Julia",
    "son": "Tom",
    "daughter": "Clara"
}

और एक पार्सर का उपयोग करें जो वस्तुओं के क्रम को बनाए रखता है।

* शायद और भी :)


1
गलत, कम से कम यदि आप JSON पार्सर उपयोग के बारे में बात कर रहे हैं। V8 ऑर्डर को बनाए रखता है, और मेरा अनुमान है कि यह अकेले JSON पार्सर उपयोग के 1% से अधिक के लिए जिम्मेदार है। code.google.com/p/v8/issues/detail?id=164#c1
बेंजामिन एटकिन

3
@BenAtkin यह मजेदार है कि आपका लिंक इस बात की व्याख्या को इंगित करता है कि V8 कैसे ऑर्डर को बनाए नहीं रखता है।
user123444555621

2
"डी फैक्टो मानक सम्मिलन क्रम से मेल खाना है, जो V8 भी करता है, लेकिन एक अपवाद के साथ"
बेंजामिन एटकिन

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