क्या JSON कुंजियों को उद्धरणों से घिरा होना चाहिए?


234

उदाहरण: निम्नलिखित कोड JSON युक्ति के खिलाफ वैध है ?

{
    precision: "zip"
}

या मुझे हमेशा निम्नलिखित सिंटैक्स का उपयोग करना चाहिए? (और यदि हां, तो क्यों?)

{
    "precision": "zip"
}

मुझे वास्तव में JSON विनिर्देशों में इसके बारे में कुछ नहीं मिला है। हालांकि वे अपने उदाहरणों में अपनी कुंजियों के आसपास उद्धरण का उपयोग करते हैं।

जवाबों:


146

हां, आपको उद्धरण चिह्नों की आवश्यकता है। यह आसान बनाने के लिए है और जावास्क्रिप्ट आरक्षित खोजशब्दों के लिए एक और भागने की विधि है, यानी होने से बचने के लिए {for:"foo"}


12
उद्धरण कई स्थितियों में सरल नहीं होते हैं, जैसे कि कॉन्फ़िगर की गई फाइलें जो हाथ से संपादित की जाती हैं। JSON के बारे में दुर्भाग्यपूर्ण बात (और दुरुपयोग) एक लगभग सार्वभौमिक इंटरचेंज प्रारूप के रूप में है कि इसमें जावास्क्रिप्ट के लिए विशिष्ट विशेषताएं हैं।
मिगेल

12
वास्तविक कारण - इस उत्तर की भी जाँच करें - stackoverflow.com/questions/4201441/…
TechMaze

3
Tl; dr: वे कुंजीशब्दों के रूप में आरक्षित कीवर्ड पर ECMAScript सीमा (अयोग्य) से निपटना नहीं चाहते थे, इसलिए उन्हें सभी कुंजियों को उद्धृत करने की आवश्यकता थी।
बॉलपॉइंटबैन

136

आप कुंजी के रूप में तार का उपयोग करने के लिए सही हैं। यहाँ RFC 4627 का एक अंश दिया गया है - जावास्क्रिप्ट ऑब्जेक्ट नोटेशन (JSON) के लिए एप्लीकेशन / json मीडिया टाइप

2.2। वस्तुओं

एक वस्तु संरचना को शून्य या अधिक नाम / मूल्य जोड़े (या सदस्यों) के आसपास घुंघराले कोष्ठक की एक जोड़ी के रूप में दर्शाया गया है। एक नाम एक स्ट्रिंग है । प्रत्येक नाम के बाद एक एकल बृहदान्त्र आता है, नाम को मूल्य से अलग करता है। एक एकल अल्पविराम निम्नलिखित नाम से एक मान को अलग करता है। किसी ऑब्जेक्ट के नाम अद्वितीय होने चाहिए।

object = begin-object [ member *( value-separator member ) ] end-object

member = string name-separator value

[...]

2.5। स्ट्रिंग्स

स्ट्रिंग्स का प्रतिनिधित्व प्रोग्रामिंग भाषाओं के सी परिवार में उपयोग किए जाने वाले सम्मेलनों के समान है। एक स्ट्रिंग शुरू होती है और उद्धरण चिह्नों के साथ समाप्त होती है। [...]

string = quotation-mark *char quotation-mark

quotation-mark = %x22 ; "

पूरा RFC यहां पढ़ें ।


11
और विचार को समाप्त करने के लिए, धारा 2.5 कहती है A string begins and ends with quotation marks.:।
राकसलिस

13

से 2.2। वस्तुओं

एक वस्तु संरचना को शून्य या अधिक नाम / मूल्य जोड़े (या सदस्यों) के आसपास घुंघराले कोष्ठक की एक जोड़ी के रूप में दर्शाया गया है। एक नाम एक स्ट्रिंग है।

और 2.5 से। स्ट्रिंग्स

एक स्ट्रिंग शुरू होती है और उद्धरण चिह्नों के साथ समाप्त होती है।

तो मैं कहूंगा कि मानक के अनुसार: हाँ, आपको हमेशा कुंजी को उद्धृत करना चाहिए (हालाँकि कुछ पार्सर्स अधिक क्षमा करने वाले हो सकते हैं)


7

हां, उद्धरण अनिवार्य हैं। http://json.org/ कहता है:

string
    ""
    " chars "

0

हाँ, वो करते हैं। लेकिन अगर आपको अन्यथा की आवश्यकता है, तो JSON5 चेकआउट करें

JSON5 JSON का एक सुपरसेट है जो ES5 सिंटैक्स की अनुमति देता है, जिसमें शामिल हैं:

  • अयोग्य संपत्ति कुंजियाँ
  • एकल-उद्धृत, बच गए और बहु-पंक्ति तार
  • वैकल्पिक संख्या प्रारूप
  • टिप्पणियाँ
  • अतिरिक्त व्हाट्सएप

JSON5 संदर्भ कार्यान्वयन ( json5NPM पैकेज ) एक प्रदान करता है JSON5उद्देश्य यह है कि है parseऔर stringifyएक ही आर्ग और बिल्ट-इन के रूप में अर्थ विज्ञान के साथ तरीकों JSONवस्तु।


-2

चूँकि आप "parent.child" डॉटेड नोटेशन डाल सकते हैं और आपको पैरेंट ["चाइल्ड"] नहीं डालना होगा, जो वैध और उपयोगी भी हो, मैं कहूँगा कि दोनों तरीके तकनीकी रूप से स्वीकार्य हैं। पार्सर्स सभी को दोनों तरह से ठीक करना चाहिए। यदि आपके पार्सर को कुंजियों पर उद्धरण की आवश्यकता नहीं है, तो संभवतः उन्हें नहीं रखना बेहतर है (स्थान बचाता है)। यह उन्हें तार कहने के लिए समझ में आता है क्योंकि वही है जो वे हैं, और चूंकि वर्ग कोष्ठक आपको कुंजी के लिए मूल्यों का उपयोग करने की क्षमता देता है, अनिवार्य रूप से यह सही समझ में नहीं आता है। Json में आप डाल सकते हैं ...

>var keyName = "someKey";
>var obj = {[keyName]:"someValue"};

>obj
Object {someKey: "someValue"}

मुद्दों के बिना ठीक है, अगर आपको एक कुंजी के लिए एक मूल्य की आवश्यकता है और कोई भी उद्धृत काम नहीं करेगा, तो यदि ऐसा नहीं होता है, तो आप ऐसा नहीं कर सकते हैं, इसलिए आपको "कुंजियों पर उद्धरण की आवश्यकता नहीं है"। यहां तक ​​कि अगर यह कहना सही है कि वे तकनीकी रूप से तार हैं। तर्क और उपयोग अन्यथा बहस करते हैं। न ही यह आधिकारिक रूप से ऑब्जेक्ट {"someKey": "someValue"} को किसी भी ब्राउज़र के कंसोल से चलने वाले हमारे उदाहरण में obj के लिए आउटपुट करता है।


2
JSON को परिभाषित करने वाले स्वीकृत उत्तर और RFC दोनों का कहना है कि उद्धरणों की आवश्यकता है।
कीथ थॉम्पसन

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

2
आप तीन अलग-अलग चीजों को मिला रहे हैं: JSON, JavaScript ऑब्जेक्ट शाब्दिक और ब्राउज़र डेवलपर टूल कंसोल आउटपुट। जब आप अपने objकंसोल में टाइप करते हैं , तो ब्राउज़र ऑब्जेक्ट के कुछ मानव-पठनीय प्रतिनिधित्व को प्रदर्शित करता है। यह इसे एक वस्तु शाब्दिक के रूप में प्रदर्शित कर सकता है (जैसा कि यह आपके उदाहरण में किया गया है), या यह कुछ अन्य प्रतिनिधित्व का उपयोग कर सकता है, यहां तक ​​कि एक संवादात्मक भी। यदि कोई मान्य पहचानकर्ता है और आरक्षित शब्द नहीं है, तो जावास्क्रिप्ट ऑब्जेक्ट शाब्दिकों को एक प्रमुख नाम के उद्धरणों की आवश्यकता नहीं होती है। हालाँकि, JSON को हमेशा प्रमुख नामों के उद्धरणों की आवश्यकता होती है।
माइकल गेरी

3
आगे के उदाहरणों के अनुसार, objकंसोल में टाइप करने के बजाय , प्रयास करें JSON.stringify(obj)। अब आपको उद्धृत कुंजी नाम के साथ पूर्ण वस्तु का वैध JSON प्रतिनिधित्व दिखाई देगा। इसके विपरीत, यह देखने के लिए कि क्या स्ट्रिंग स्ट्रिंग JSON मान्य है, प्रयास करें JSON.parse(string)। यदि चाबियाँ उद्धृत नहीं की जाती हैं, तो यह एक अपवाद फेंक देगा। उदाहरण के लिए, JSON.parse('{"a":"b"}')सफल होंगे, लेकिन JSON.parse('{a:"b"}')असफल रहेंगे।
माइकल गेरी

1
OTOH, आपका उपयोग var obj = {[keyName]:"someValue"};बहुत दिलचस्प है! मुझे नहीं पता था कि आप जावास्क्रिप्ट ऑब्जेक्ट शाब्दिक में ऐसा कर सकते हैं। थोड़ी सी जाँच से पता चलता है कि यह ES6 में कुछ नया है - आप इसे ES5 में नहीं कर सकते।
माइकल गेरी 7
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.