JSON में, प्रत्येक नाम क्यों उद्धृत किया गया है?


91

JSON कल्पना कहती है कि JSON एक ऑब्जेक्ट या एक सरणी है। किसी वस्तु के मामले में,

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

और बाद में, युक्ति कहती है कि एक स्ट्रिंग उद्धरणों में घिरा हुआ है।

क्यों?

इस प्रकार,

{"Property1":"Value1","Property2":18}

और नहीं

{Property1:"Value1",Property2:18}

प्रश्न 1 : क्यों नहीं नाम / मूल्य जोड़े में नाम को अयोग्य पहचानकर्ता बनने की अनुमति दें?


प्रश्न 2 : क्या जावास्क्रिप्ट में मूल्यांकन किए जाने पर, ऊपर दिए गए दो अभ्यावेदन के बीच एक शब्दार्थक अंतर है?


1
@ ब्रूनो: आप एक्सएमएल की उसी तरह से बात कर सकते थे ... और दुख की बात है कि कुछ लोग अच्छी तरह से एक्सएमएल को प्रोग्रामिंग भाषा के रूप में इस्तेमाल करने की कोशिश कर सकते हैं ...
माइक डेसिमोन

2
+1 ... यह एक अजीब विरोधाभास की तरह लगता है .... "उद्धरण के साथ" यह मानक JSON बनाता है, लेकिन eval()(यानी जावास्क्रिप्ट) के साथ काम नहीं करेगा ।
स्केफमैन

2
@bruno, नहीं। यदि आप इसे विस्तारित करते हैं, तो यह "जावास्क्रिप्ट ऑब्जेक्ट नोटेशन" में हो जाता है, जो ठीक है
डेव आर्चर

2
@skaffman - यह जावास्क्रिप्ट में विकसित होने पर काम करेगा।
क्वेंटिन

1
@Bruno - JSON एक डेटा प्रारूप है। "JSON में" का अर्थ है - युक्ति के अनुसार युक्ति के साथ।
चेसो

जवाबों:


57

प्रश्न 1: नाम / मान जोड़े में नाम को अयोग्य पहचानकर्ता बनने की अनुमति क्यों नहीं दी जाती है?

JSON का डिज़ाइन दर्शन "इसे सरल रखें" है

"के साथ उद्धरण नाम "" की तुलना में बहुत सरल है "आप के साथ नाम उद्धृत कर सकते हैं "या 'आपके पास नहीं है, जब तक कि उनके पास कुछ वर्ण (या वर्णों का संयोजन जो इसे एक कीवर्ड बना देगा) और 'या "उद्धृत करने की आवश्यकता हो सकती है आपके द्वारा चुने गए परिसीमन पर "

प्रश्न 2: क्या जावास्क्रिप्ट में मूल्यांकन किए जाने पर, ऊपर दिए गए दो अभ्यावेदन के बीच एक शब्दार्थ अंतर है?

नहीं। जावास्क्रिप्ट में वे समान हैं।


3
नहीं, यह सही नहीं है। CMS का सही उत्तर है। यह उत्तर वास्तविक कारण का सिर्फ एक अच्छा पक्ष-प्रभाव है। समझाने में सरल होने के अलावा, एक पार्सर लिखना भी सरल है, क्योंकि आप पहचानकर्ताओं पर स्ट्रिंग के लिए पार्स नियमों का पुन: उपयोग कर सकते हैं।
ब्रेटन

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

2
CMS के उत्तर पर +1, यह सही है। डबल कोट्स एक कोड कन्वेंशन नहीं हैं, लेकिन आप ऑब्जेक्ट में कुंजी के रूप में आरक्षित शब्दों से बचना चाहते हैं। उदाहरण के लिए: {property1: "abc", यह: "def"} WRONG (यह एक आरक्षित कीवर्ड है)
सोरिन मोकाणु

प्रश्न 2 : जावास्क्रिप्ट में एक छोटा सा अंतर का उपयोग करते समय JSON.parseसमारोह: JSON.parse('{"a":1}') अच्छी तरह से काम करता है , क्यों JSON.parse('{a:1}')होगा एक अपवाद बढ़ा
न्हान्घिया

@nhnghia - प्रश्न 2 स्रोत कोड के मूल्यांकन के बारे में है जावास्क्रिप्ट के रूप में , JSON नहीं। JSON.parseजावास्क्रिप्ट में कार्यान्वित JSON पार्सर है, यह जावास्क्रिप्ट पार्सर नहीं है।
क्वेंटिन

134

मैं एक प्रस्तुति से एक उद्धरण छोड़ता हूं जो डगलस क्रॉकफोर्ड (जेएसएन मानक के निर्माता) ने याहू को दिया था।

वह इस बारे में बात करता है कि उसने JSON की खोज कैसे की , और अन्य बातों के अलावा उसने उद्धृत कुंजियों का उपयोग करने का निर्णय क्यों लिया :

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

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

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

आप पूरा वीडियो और ट्रांसक्रिप्ट यहां पा सकते हैं ।


उम्म ... JSON मानक के निर्माता ?! मेरा मानना ​​है कि यह एक अतिरंजना है। JSON जावास्क्रिप्ट ऑब्जेक्ट संकेतन है और जावास्क्रिप्ट (ECMA) युक्ति से आता है।
सोरिन मोकानु

42
@ सोरीन: जावास्क्रिप्ट ऑब्जेक्ट के साथ JSON को भ्रमित न करें। JSON एक भाषा-अज्ञेय डेटा इंटरचेंज प्रारूप है, जो 2006 में क्रॉकफोर्ड द्वारा प्रस्तावित ( tools.ietf.org/html/rfc4627 ) है, इसका व्याकरण जावास्क्रिप्ट ऑब्जेक्ट शाब्दिक ( bclary.com/2004/07/07/#a-11.1 ) से अलग है .5 ), मूल रूप से केवल स्ट्रिंग कीज़ और वैल्यूज़ की अनुमति देकर MUST एक ऑब्जेक्ट , एरे , नंबर , स्ट्रिंग या निम्नलिखित शाब्दिक नामों में से एक होना चाहिए : असत्य , शून्य सत्य । जावास्क्रिप्ट में ऑब्जेक्ट शाब्दिकों में पहचानकर्ता , स्ट्रिंग शाब्दिक या के रूप में चाबियाँ हो सकती हैंसंख्या शाब्दिक , और मान किसी भी प्रकार की अभिव्यक्ति हो सकती है ...
CMS

@ CMS और आज का जावास्क्रिप्ट ऑब्जेक्ट कंस्ट्रक्टर एक्सप्रेशंस के अंदर शॉर्टहैंड आइडेंटिफ़ायर की अनुमति देता है, जैसे: { a }जहाँ प्रॉपर्टी 'a' ग्लोबल या लोकल वेरिएबल 'a' की वैल्यू को कॉपी करती है।
हाइड्रोपर

@ सीएमएस और वहाँ भी गणना की चाबियाँ हैं:{[key]: value}
हाइड्रोपर

0

दोनों :और व्हाट्सएप की पहचानकर्ताओं में अनुमति है। उद्धरण के बिना, यह पहचान का कारण बनने के दौरान अस्पष्टता पैदा करेगा कि वास्तव में पहचानकर्ता का गठन क्या होता है।


0

जावास्क्रिप्ट में ऑब्जेक्ट्स को हैश / हैशटेबल की तरह मुख्य जोड़े के साथ इस्तेमाल किया जा सकता है।

हालाँकि अगर आपकी कुंजी में ऐसे अक्षर हैं जो जावास्क्रिप्ट एक नाम के रूप में टोकन नहीं कर सकते हैं, तो यह एक कुंजी के बजाय किसी ऑब्जेक्ट पर एक संपत्ति की तरह पहुंचने की कोशिश करते समय विफल हो जाएगा।

var test  = {};
test["key"] = 1;
test["#my-div"] = "<div> stuff </div>";

// test = { "key": 1, "#my-div": "<div> stuff </div>" };

console.log(test.key);           // should be 1
console.log(test["key"]);        // should be 1
console.log(test["#my-div"]);    // should be "<div> stuff </div>";
console.log(test.#my-div);       // would not work.

पहचानकर्ताओं के पास कभी-कभी ऐसे अक्षर हो सकते हैं, जिन्हें जावास्क्रिप्ट में एक टोकन / पहचानकर्ता के रूप में मूल्यांकन नहीं किया जा सकता है, इस प्रकार सभी पहचानकर्ताओं को स्थिरता के लिए तार में रखने के लिए सबसे अच्छा है।


-2

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

मैं अगले व्यक्ति के लिए शेष को सरल बनाना चाहता था जो इस प्रश्न पर जाता है उसी विचार के साथ जो मैंने किया था। यहाँ मांस है:

ऑब्जेक्ट कुंजी के रूप में उपयोग किए जाने पर JSON में परिवर्तनीय नाम प्रक्षेपित नहीं किए जाते हैं (धन्यवाद फ्राइडो!)

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

var a = {do:1,long:2,super:3,abstract:4,var:5,break:6,boolean:7};
a.break

=> 6

उद्धरणों के उपयोग के बारे में, क्वेंटिन ने लिखा है ... "लेकिन आपके पास तब तक नहीं है, जब तक कि [] कुंजी में कुछ वर्ण नहीं होते (या वर्णों का संयोजन जो इसे एक कीवर्ड बनाता है)"

मैंने पाया कि पूर्व भाग (कुछ वर्ण) सत्य है, @ चिह्न का उपयोग करते हुए (वास्तव में, मुझे लगता है कि $ और _ एकमात्र पात्र हैं जो त्रुटि का कारण नहीं हैं):

var a = {a@b:1};

=> सिंटैक्स त्रुटि

var a = {"a@b":1};
a['a@b']

=> १

लेकिन खोजशब्दों के बारे में पैतृक, जैसा कि मैंने ऊपर दिखाया, सच नहीं है।

जो मैं चाहता था वह काम करता है क्योंकि उद्घाटन {और बृहदान्त्र के बीच, या अल्पविराम और बृहदान्त्र के बीच के बाद के गुणों के लिए पाठ का उपयोग किसी वस्तु को कुंजी बनाने के लिए एक अयोग्य स्ट्रिंग के रूप में किया जाता है, या, जैसा कि फ़्रीडो ने इसे रखा है, एक चर नाम है। टी प्रक्षेपित:

var uid = getUID();
var token = getToken();            // Returns ABC123
var data = {uid:uid,token:token};
data.token

=> ABC123


-3

यदि json वस्तुओं का वर्णन करता है, तो व्यवहार में आपको निम्नलिखित मिलते हैं

var foo = {};

var bar = 1;

foo["bar"] = "hello";
foo[bar] = "goodbye";

तो फिर,

foo.bar == "hello";
foo[1] == "goodbye" // in setting it used the value of var bar

यहां तक ​​कि अगर आपके उदाहरण एक ही परिणाम का उत्पादन करते हैं, तो "कच्चे कोड" में उनके समकक्ष नहीं होंगे। शायद इसीलिए?? डननो, सिर्फ एक विचार।


3
@ डेविड, चर नामों को जेएस में प्रक्षेपित नहीं किया जाता है जब एक ऑब्जेक्ट कुंजी के रूप में उपयोग किया जाता है। { bar: 'goodbye' }के मान को मुख्य नाम सेट नहीं करेगा bar, यह सिर्फ होगा bar। दूसरों को इस कारण के बारे में सही है कि कल्पना को उद्धरण की आवश्यकता क्यों है: यह कीवर्ड और विशेष-वर्ण संघर्षों से बचने के लिए है।
फ्राइडो

-3

यदि आवश्यक हो तो केवल नाम के उद्धरण की अनुमति होने पर यह डेटा आकार को कम कर सकता है

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