क्या JSON कुंजी के लिए उद्धृत स्ट्रिंग्स का उपयोग करने का कोई व्यावहारिक कारण है?


87

Crockford के अनुसार json.org , एक JSON वस्तु से बना है के सदस्यों , जिनमें से बना है जोड़े

प्रत्येक जोड़ी एक स्ट्रिंग और मान से बनी होती है , जिसके साथ एक स्ट्रिंग को परिभाषित किया जाता है:

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

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

क्या दोहरे उद्धरण चिह्नों में अपने JSON को घेरने का कोई मतलब है?

मान्य उदाहरण:

{
  "keyName" : 34
}

अमान्य के विपरीत:

{
   keyName : 34
}

20
"क्यों सही करने के लिए परेशान?" यह एक प्रकार की आलसी सोच है जो अमान्य मार्कअप वाली वेबसाइटों की ओर ले जाती है। भविष्य प्रूफ मामले में अपने कोड कुछ ब्राउज़र करता दोहरे उद्धरण चिह्नों की आवश्यकता है।
meagar

21
"क्यों सही करने के लिए परेशान?" - क्यों एक सम्मेलन है कि कोई और करता है, अगर कोई वास्तविक लाभ नहीं है का पालन करने के लिए परेशान? शायद आप व्यावहारिक सोच के साथ आलसी सोच को भ्रमित करते हैं।
मार्क रोजर्स

15
@ मर्क - "कि कोई और नहीं करता है" ... आपको यह विचार कहां से मिला? हर बड़े प्लेटफार्म में बनाया गया JSON धारावाहिक उचित उद्धरण देता है।
निक Craver

7
@Mark रोजर्स PHP json_encode फ़ंक्शन उदाहरण के लिए, डबल उद्धृत स्ट्रिंग्स के साथ वैध JSON उत्पन्न करता है। शायद आप जावास्क्रिप्ट में वस्तु शाब्दिक सोच रहे हैं? यह सच है कि वे कुंजियाँ उद्धृत किए बिना काम करते हैं, लेकिन यह JSON नहीं है।
JAL

9
रिकॉर्ड के लिए, वर्षों पहले जब मैंने यह पोस्ट किया था, मैं JSON और ऑब्जेक्ट शाब्दिक अंकन के बीच अंतर के बारे में उलझन में था जैसा कि @JAL ने सुझाव दिया था। दोनों का एक समान सिंटैक्स है, अंततः इस मुद्दे का वर्णन करने में कुछ भ्रम हुआ।
मार्क रोजर्स

जवाबों:


155

JSON कुंजी को उद्धरण में क्यों होना चाहिए, इसके बारे में वास्तविक कारण, ECMAScript 3 के पहचानकर्ताओं के शब्दार्थों पर निर्भर करता है।

आरक्षित शब्द के रूप में इस्तेमाल नहीं किया जा सकता संपत्ति के नाम , उद्धरण चिह्नों के बिना वस्तु Literals में उदाहरण के लिए:

({function: 0}) // SyntaxError
({if: 0}) // SyntaxError
({true: 0}) // SyntaxError
// etc...

यदि आप उद्धरण का उपयोग करते हैं तो संपत्ति के नाम मान्य हैं:

({"function": 0}) // Ok
({"if": 0}) // Ok
({"true": 0}) // Ok

खुद क्रॉकफ़ोर्ड इस बात में इसे समझाता है , वे JSON मानक को सरल रखना चाहते थे, और वे उस पर उन सभी अर्थ प्रतिबंधों को रखना नहीं चाहेंगे:

....

यह तब था जब हमने बिना नाम वाली समस्या का पता लगाया था। यह पता चलता है कि ECMA स्क्रिप्ट 3 में एक अजीब आरक्षित शब्द नीति है। आरक्षित शब्दों को महत्वपूर्ण स्थिति में उद्धृत किया जाना चाहिए, जो वास्तव में एक उपद्रव है। जब मैं इसे एक मानक के रूप में तैयार करने के लिए मिला, तो मैं मानक शब्दों में सभी आरक्षित शब्दों को रखना नहीं चाहता था, क्योंकि यह वास्तव में मूर्खतापूर्ण लगेगा।

उस समय, मैं लोगों को समझाने की कोशिश कर रहा था: हाँ, आप जावास्क्रिप्ट में एप्लिकेशन लिख सकते हैं, यह वास्तव में काम करने वाला है और यह एक अच्छी भाषा है। मैं एक ही समय में कहना नहीं चाहता था: और इस मूर्खतापूर्ण चीज़ को देखो जो उन्होंने किया था! तो मैंने फैसला किया, इसके बजाय, चलो बस चाबियाँ बोली।
इस तरह, हमें किसी के बारे में बताने की ज़रूरत नहीं है कि यह कितना अजीब है।

इसीलिए, आज तक, JSON में कुंजियाँ उद्धृत की जाती हैं।

...

ECMAScript 5 वीं संस्करण मानक इसे ठीक करता है, अब ES5 कार्यान्वयन में, आरक्षित शब्दों का भी उद्धरण के बिना इस्तेमाल किया जा सकता है, दोनों में, वस्तु शाब्दिक और सदस्य पहुंच ( obj.functionES5 में ठीक है)।

केवल रिकॉर्ड के लिए, यह मानक सॉफ्टवेयर विक्रेताओं द्वारा इन दिनों लागू किया जा रहा है, आप देख सकते हैं कि ब्राउज़र इस संगतता तालिका में इस सुविधा को क्या शामिल करते हैं ( संपत्ति के नाम के रूप में आरक्षित शब्द देखें )


1
@ नमस्कार, आपका स्वागत है। ध्यान रखें कि JSON केवल एक भाषा-अज्ञेय डेटा इंटरचेंज प्रारूप है, भले ही इसका सिंटैक्स जावास्क्रिप्ट ऑब्जेक्ट लिटरल सिंटैक्स से प्रेरित था, उनके बीच मतभेद हैं (केवल उद्धृत कुंजियों की तुलना में बहुत अधिक)।
क्रिश्चियन सी। साल्वादो

2
@ सीएमएस, तो यह केवल दोहरे उद्धरण क्यों होना चाहिए? JSON में एकल उद्धरण अमान्य क्यों हैं?
पचेरियर

1
JSON मानक को यथासंभव सरल रखने के लिए एकल उद्धरण अस्वीकृत हैं। JSON को केवल जावास्क्रिप्ट का एक सबसेट होना चाहिए, इसे यथासंभव जावास्क्रिप्ट को लागू करने की आवश्यकता नहीं है।
thomasrutter

JSON5 कल्पना सुपरसेट ES5 वाक्य रचना का पालन करता है और इस तरह अन्य बातों के साथ गैर उद्धृत कुंजी का समर्थन करता है। पुस्तकालय में संगत parseऔर stringifyविधियाँ हैं।
Inigo

उस संगतता तालिका लिंक में (उत्तर के निचले भाग में) आरक्षित शब्द प्रविष्टि ऑब्जेक्ट / सरणी शाब्दिक एक्सटेंशन अनुभाग के अंतर्गत है। और टीएल; डीआर, सभी सूचीबद्ध ब्राउज़र (सभी के बारे में आपने सुना है और लगभग 20 और) सभी "हां" कहते हैं।
i336_

16

हां, यह अमान्य JSON है और इसे कई मामलों में अन्यथा अस्वीकार कर दिया जाएगा, उदाहरण के लिए jQuery 1.4+ में एक चेक है जो बिना किसी कारण के JSON को चुपचाप विफल बना देता है। आज्ञाकारी क्यों नहीं हो?

आइए एक और उदाहरण लेते हैं:

{ myKey: "value" }
{ my-Key: "value" }
{ my-Key[]: "value" }

... ये सभी उद्धरणों के साथ मान्य होंगे , क्यों नहीं सुसंगत हो और सभी मामलों में उनका उपयोग करें, समस्या की संभावना को समाप्त करें?

वेब डेवलपर की दुनिया में एक और आम उदाहरण: अमान्य HTML के हजारों उदाहरण हैं जो अधिकांश ब्राउज़रों में प्रदान करते हैं ... क्या यह डिबग या बनाए रखने के लिए कोई कम दर्दनाक बनाता है? बिलकुल नहीं, बिलकुल विपरीत।

इसके अलावा @ मैथ्यू नीचे टिप्पणियों में सभी का सबसे अच्छा बिंदु बनाता है, यह पहले से ही विफल हो जाता है, निर्विवाद कुंजी JSON.parse()सभी प्रमुख ब्राउज़रों (और इसे सही ढंग से लागू करने वाले किसी भी अन्य) के साथ एक वाक्यविन्यास त्रुटि को फेंक देगी , आप इसे यहां परीक्षण कर सकते हैं


हां, मेरे पास कुछ पुराने अजाक्स एप्लिकेशन थे जो स्कोनकी जोंस सर्वर-साइड जनरेट कर रहे थे, जो कुंजी नामों के आसपास दोहरे उद्धरण चिह्नों की कमी के कारण jquery 1.4 में अपग्रेड होने पर विफल हो गए थे।
JAL

आप जोड़ना चाह सकते हैं कि सभी प्रमुख ब्राउज़र ' JSON.parseइसे सही ढंग से अस्वीकार भी करेंगे।
मैथ्यू फ्लेशेन

मैं उत्सुक हूं कि किस तरह से JQuery 1.4 चुपचाप इस प्रकार के अमान्य जोंस के साथ विफल हो जाएगा?
मार्क रोजर्स

1
@ मर्क - किसी भी मामले में यह ठीक से उद्धृत या अमान्य वर्ण नहीं है ... मूल रूप से यह किसी भी अमान्य JSON के साथ विफल हो जाएगा।
निक Craver

यह दिलचस्प है, कि JQuery 1.4 के साथ मेरा अनुभव नहीं रहा है। इसके अलावा, मुझे नहीं लगता है कि jQuery json ऑब्जेक्ट्स बनाने के लिए ज़िम्मेदार है, यह है कि ब्राउज़र की जावास्क्रिप्ट इंटरप्रेटर क्या नहीं करता है? क्या आप जेकरी जोंस डिसिएरलाइजेशन की बात कर रहे हैं?
मार्क रोजर्स

-4

YAML, जो वास्तव में JSON का सुपरसेट है, जो आप करना चाहते हैं, उसका समर्थन करता है। हालांकि इसके एक सुपरसेट, यह आपको इसे जितना चाहे उतना सरल रखने की सुविधा देता है।

YAML ताजी हवा की एक सांस है और यह देखने के लिए आपके समय के लायक हो सकता है। शुरू करने के लिए सबसे अच्छी जगह यहाँ है: http://en.wikipedia.org/wiki/YAML

सूरज के नीचे हर भाषा के लिए जेएस, जैसे https://github.com/nodeca/js-yaml


11
YAML JSON का सुपरसेट नहीं है।
जॉन गिब

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