2010-01-14 10 views
78

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

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

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

क्यों?

इस प्रकार,

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

और नहीं

{Property1:"Value1",Property2:18} 

प्रश्न 1: क्यों नाम/मान युग्म में नाम गैर उद्धृत पहचानकर्ता होने की अनुमति नहीं है?


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

+0

क्या आप "JSON में" मतलब है की अनुमति है? यह "जेएसओएन" प्रोग्रामिंग भाषा की तरह दिखता है। –

+1

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

+2

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

उत्तर

53

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

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

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

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

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

+2

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

+0

और उससे अलग, इसमें एक मामूली अर्थपूर्ण अंतर है यदि कोई पहचानकर्ता आरक्षित शब्द होता है, तो इसे पहचानकर्ता के बजाए उस शब्द के रूप में व्याख्या किया जाता है। – Breton

+2

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

0

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

125

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

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

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

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

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

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

+0

Ummm ... JSON मानक की * निर्माता *?! मेरा मानना ​​है कि यह एक अतिस्तरीय है। जेएसओएन जावास्क्रिप्ट ऑब्जेक्ट नोटेशन है और जावास्क्रिप्ट (ईसीएमए) स्पेक से आता है। –

+39

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

+0

@ सीएमएस और आज की जावास्क्रिप्ट ऑब्जेक्ट कन्स्ट्रक्टर एक्सप्रेशन के अंदर शॉर्टेंड पहचानकर्ताओं को अनुमति देती है, उदाहरण: '{a} ', जहां संपत्ति' ए 'वैश्विक या स्थानीय चर' ए 'के मान की प्रतिलिपि बनाता है। – Hydro

-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: 'अलविदा'}' कुंजी नाम को 'बार' के मान पर सेट नहीं करेगा, यह केवल 'बार' होगा। दूसरों को इस कारण के बारे में सही है कि spec को उद्धरण की आवश्यकता क्यों है: यह कीवर्ड और विशेष-चरित्र संघर्ष से बचने के लिए है। – friedo

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. 

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

-1

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

मैं अगले व्यक्ति के लिए शेष को सरल बनाना चाहता था जो इस प्रश्न के साथ मेरे विचार के साथ दौरा करता था। यहाँ मांस है: जब के रूप में एक वस्तु कुंजी (! धन्यवाद Friedo)

ब्रेटन, बजाय "कुंजी" का "पहचानकर्ता" का उपयोग कर, लिखा इस्तेमाल किया

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

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

=> 6

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

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

var a = {[email protected]:1}; 

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

var a = {"[email protected]":1}; 
a['[email protected]'] 

=> 1

लेकिन कीवर्ड के बारे में निक्षिप्त, जैसा कि मैंने ऊपर से पता चला है, नहीं सच है।

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

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

=> ABC123

-2

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

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