2010-11-17 20 views
68

Crockford के json.org, एक JSON वस्तु के अनुसार सदस्यों, जो जोड़े से बना है से बना है।क्या JSON कुंजी के लिए उद्धृत तारों का उपयोग करने का कोई व्यावहारिक कारण है?

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

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

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

क्या यह आपके JSON के आस-पास डबल कोट्स में परेशान करने का कोई अर्थ है?

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

{ 
    "keyName" : 34 
} 

के रूप में अमान्य करने का विरोध किया:

{ 
    keyName : 34 
} 
+11

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

+13

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

+12

@ मार्क -" कोई और नहीं करता "... आपको यह विचार कहां मिला? ** ** ** ** में निर्मित जेएसओएन सीरियलाइज़र उचित उद्धरण करता है। –

उत्तर

123

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

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

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

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

खुद Crockford

Reserved words उदाहरण के लिए, संपत्ति के नाम उद्धरण चिह्नों के बिना वस्तु Literals में के रूप में इस्तेमाल नहीं किया जा सकता इसे this talk में बताते हैं, वे JSON मानक को सरल रखना चाहते थे, और वे उन सभी अर्थपूर्ण प्रतिबंधों को पसंद नहीं करना चाहते:

....

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

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

यही कारण है कि, इस दिन, कुंजियों को JSON में उद्धृत किया गया है।

...

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

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

+3

वाह, वह सब कुछ था जिसे मैं ढूंढ रहा था। धन्यवाद! –

+1

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

+2

@ सीएमएस, तो यह केवल दोहरे उद्धरण क्यों होना चाहिए? जेएसओएन में सिंगल कोट्स अमान्य क्यों हैं? – Pacerier

15

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

चलो एक और उदाहरण लेते हैं:

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

... इन के सभी उद्धरण के साथ मान्य होगा, क्यों नहीं अनुरूप होना चाहिए और उन्हें सभी मामलों में उपयोग करते हैं, एक समस्या की संभावना को नष्ट?

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

इसके अलावा

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

+0

हाँ, मेरे पास कुछ पुराने AJAX ऐप्स थे जो स्कॉन्की जेसन सर्वर-साइड उत्पन्न करते थे, जो मुख्य नामों के चारों ओर डबल कोट्स की कमी के कारण jquery 1.4 में अपग्रेड होने पर विफल रहा। – JAL

+0

आप यह जोड़ना चाहेंगे कि सभी प्रमुख ब्राउज़रों 'JSON.parse' भी इसे सही तरीके से अस्वीकार कर देंगे। –

+0

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

-3

YAML, जिसमें है (संपत्ति के नाम रूप सुरक्षित शब्द देखें) में शामिल वास्तव में जेएसओएन का एक सुपरसेट, जो आप करना चाहते हैं उसका समर्थन करता है। हालांकि यह एक सुपरसेट है, यह आपको जितना चाहें उतना सरल रखने देता है।

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

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

+5

वाईएएमएल जेएसओएन का सुपरसेट नहीं है। –

+0

क्यों जानकारी के लिए: http://stackoverflow.com/questions/25974485/yaml-as-a-json-superset-and-tab-characters –

संबंधित मुद्दे

 संबंधित मुद्दे