न्यूनतम वैध JSON क्या है?


174

मैंने JSON विवरण http://json.org/ को ध्यान से पढ़ा है, लेकिन मुझे यकीन नहीं है कि मुझे सरल प्रश्न का उत्तर पता है। क्या तार न्यूनतम संभव वैध JSON हैं?

  • "string" स्ट्रिंग वैध JSON है?
  • 42 क्या साधारण नंबर JSON है?
  • true क्या बूलियन एक वैध JSON है?
  • {} खाली वस्तु एक वैध JSON है?
  • [] खाली सरणी एक वैध JSON है?

12
Jsonlint.com पर परीक्षण , अंतिम दो वैध हैं, अन्य नहीं हैं।
आइरन

1
कुछ JSON पार्स एक सरणी या ऑब्जेक्ट की अपेक्षा करते हैं। वे सिर्फ एक संख्या, या एक स्ट्रिंग के बारे में शिकायत करते हैं।
akonsu

3
अब तक, वे वैध हैं
ब्रायन Colavito


संक्षिप्त उत्तर - {}
तुकाराम भोसले

जवाबों:


156

लेखन के समय, JSON को केवल RFC4627 में वर्णित किया गया था । यह वर्णन करता है कि "2" की शुरुआत में एक JSON टेक्स्ट एक धारावाहिक ऑब्जेक्ट या सरणी के रूप में है।

इसका मतलब है कि केवल {} और []वैध हैं, पार्सर्स और स्ट्रिंगर्स में JSON स्ट्रिंग्स को पूरा करें जो उस मानक का पालन करते हैं।

हालाँकि , ECMA-404 की शुरूआत में परिवर्तन होता है, और अद्यतन सलाह को यहाँ पढ़ा जा सकता है । मैंने इस मुद्दे पर एक ब्लॉग पोस्ट भी लिखा है


हालांकि मामले को और अधिक भ्रमित करने के लिए, वेब ब्राउज़र में उपलब्ध JSONवस्तु (जैसे JSON.parse()और JSON.stringify()) को ES5 में मानकीकृत किया गया है , और यह स्पष्ट रूप से स्वीकार्य JSON पाठ को परिभाषित करता है:

इस विनिर्देशन में उपयोग किया गया JSON इंटरचेंज फॉर्मेट वास्तव में RFC 4627 द्वारा दो अपवादों के साथ वर्णित है:

  • ECMAScript JSON व्याकरण के शीर्ष स्तर के JSONText उत्पादन में JSONObject या JSONArray को RFC 4627 द्वारा निर्दिष्ट किए जाने के लिए प्रतिबंधित होने के बजाय किसी JSONValue से युक्त हो सकता है।

  • Snipped

इसका अर्थ यह होगा कि JSON ऑब्जेक्ट द्वारा सभी JSON मान (स्ट्रिंग, नल और संख्या सहित) स्वीकार किए जाते हैं, भले ही JSON ऑब्जेक्ट तकनीकी रूप से RFC 4627 का पालन करता हो।

ध्यान दें कि आप इसलिए एक अनुरूप ब्राउज़र में एक संख्या JSON.stringify(5)को संशोधित कर सकते हैं, जिसे RFC4627 के पालन करने वाले किसी अन्य पार्सर द्वारा अस्वीकार कर दिया जाएगा, लेकिन जिसके पास ऊपर सूचीबद्ध विशिष्ट अपवाद नहीं है। उदाहरण के लिए, रूबी एक ऐसा उदाहरण प्रतीत होगा जो केवल वस्तुओं और सरणियों को मूल के रूप में स्वीकार करता है । दूसरी ओर, PHP विशेष रूप से इस अपवाद को जोड़ती है कि "यह स्केलर प्रकारों और NULL को एन्कोड और डिकोड करेगा"।


@amdorra: क्या आप अधिक विशिष्ट हो सकते हैं जहां आप देख रहे हैं?
मैट

5
JSON संज्ञा नहीं है, इसलिए "JSON" अर्थहीन है। कोई भी "JSON मान" एक "JSON मान" है, लेकिन पार्सर अक्सर उस RFC में परिभाषित "JSON पाठ" की अपेक्षा करते हैं।
IMSoP

2
मेरा बुरा मैं अपना जवाब तब हटा दूंगा
amdorra

1
@jmoreno क्या आप कृपया अपनी टिप्पणी स्पष्ट कर सकते हैं? आप कह रहे हैं true, falseया nullअकेले एक मान्य JSON पाठ है? क्या आप कृपया किसी स्रोत का हवाला दे सकते हैं, क्योंकि यह यहाँ अन्य अधिकांश उत्तरों / टिप्पणियों का खंडन करता है?
लॉरेंस जॉनसन

2
@jmoreno: निश्चित रूप से खंड 2 "एक JSON पाठ एक क्रमबद्ध वस्तु या सरणी है।" विरोध करता है कि? JSON लिंट भी नहीं लगता कि एक गैर-सरणी या ऑब्जेक्ट वैध है। इस बात पर कोई बहस नहीं है कि क्या एक स्ट्रिंग एक वैध JSON शाब्दिक है; यह खत्म हो गया है कि क्या एक स्ट्रिंग स्वयं मान्य है।
मैट

42

कम से कम चार दस्तावेज हैं जिन्हें इंटरनेट पर JSON मानकों के रूप में माना जा सकता है। आरएफसी ने उल्लेख किया कि सभी माइम प्रकार का वर्णन करते हैं application/json। यहां प्रत्येक को शीर्ष-स्तर के मूल्यों के बारे में कहना है, और क्या किसी वस्तु या सरणी के अलावा कुछ भी शीर्ष पर अनुमति दी गई है:

RFC-4627 : नहीं।

JSON टेक्स्ट टोकन का एक क्रम है। टोकन के सेट में छह संरचनात्मक वर्ण, तार, संख्या और तीन शाब्दिक नाम शामिल हैं।

JSON टेक्स्ट एक क्रमबद्ध ऑब्जेक्ट या सरणी है।

JSON-text = ऑब्जेक्ट / सरणी

ध्यान दें कि RFC-4627 को "प्रस्तावित मानक" के विपरीत "सूचनात्मक" के रूप में चिह्नित किया गया था, और यह RFC-7159 द्वारा पालन किया जाता है , जो कि RFC-8259 द्वारा पालन किया जाता है।

RFC-8259 : हाँ।

JSON टेक्स्ट टोकन का एक क्रम है। टोकन के सेट में छह संरचनात्मक वर्ण, तार, संख्या और तीन शाब्दिक नाम शामिल हैं।

JSON टेक्स्ट एक क्रमबद्ध मूल्य है। ध्यान दें कि JSON के कुछ पिछले विनिर्देशों ने JSON टेक्स्ट को ऑब्जेक्ट या एरे होने के लिए विवश किया था। कार्यान्वयन जो केवल वस्तुओं या सरणियों को उत्पन्न करते हैं जहां एक JSON पाठ कहा जाता है इस अर्थ में अंतर होगा कि सभी कार्यान्वयन इन्हें JSON ग्रंथों के अनुरूप स्वीकार करेंगे।

JSON-text = ws value ws

RFC-8259 की तारीख दिसंबर 2017 है और इसे "INTERNET STANDARD" के रूप में चिह्नित किया गया है।

ECMA-262 : हाँ।

JSON सिंथेटिक व्याकरण, JSON शाब्दिक व्याकरण द्वारा परिभाषित टोकन के संदर्भ में एक मान्य JSON पाठ को परिभाषित करता है। व्याकरण का लक्ष्य प्रतीक JSONText है।

सिंटेक्स JSONText:

JSONValue

JSONValue:

JSONNullLiteral

JSONBooleanLiteral

JSONObject

JSONArray

JSONString

JSONNumber

ECMA-404 : हाँ।

एक JSON पाठ यूनिकोड कोड बिंदुओं से बने टोकन का एक क्रम है जो JSON मूल्य व्याकरण के अनुरूप है। टोकन के सेट में छह संरचनात्मक टोकन, तार, संख्या और तीन शाब्दिक नाम टोकन शामिल हैं।


10

RFC 4627 में पुरानी परिभाषा के अनुसार (जो मार्च 2014 में RFC 7159 द्वारा पालन किया गया था), वे सभी "JSON मान" मान्य थे, लेकिन केवल अंतिम दो में एक पूर्ण "JSON पाठ" होगा:

JSON टेक्स्ट एक क्रमबद्ध ऑब्जेक्ट या सरणी है।

इस्तेमाल किए गए पार्सर के आधार पर, "JSON मान" को वैसे भी स्वीकार किया जा सकता है। उदाहरण के लिए ("JSON मान" बनाम "JSON टेक्स्ट" शब्दावली से चिपके हुए):

  • JSON.parse()समारोह अब आधुनिक ब्राउज़रों में मानकीकृत किसी भी "JSON मूल्य" स्वीकार करता है
  • PHP फ़ंक्शन json_decodeको 5.2.0 संस्करण में केवल "JSON पाठ" को स्वीकार करते हुए पेश किया गया था, लेकिन 5.2.1 संस्करण में किसी भी "JSON मान" को स्वीकार करने के लिए संशोधित किया गया था
  • पायथन इस मैनुअल पेज परjson.loads उदाहरणों के अनुसार किसी भी "JSON मूल्य" को स्वीकार करता है
  • सत्यापनकर्ता http://jsonlint.com पर एक पूर्ण "JSON पाठ" की उम्मीद है
  • रूबी JSON मॉड्यूल केवल एक पूर्ण "JSON पाठ" स्वीकार करेगा (कम से कम इस मैनुअल पेज पर टिप्पणियों के अनुसार )

भेद एक "XML दस्तावेज़" और "XML टुकड़ा" के बीच का अंतर जैसा है, हालाँकि तकनीकी रूप <foo />से एक सुव्यवस्थित XML दस्तावेज़ है (यह बेहतर लिखा जाएगा <?xml version="1.0" ?><foo />, लेकिन जैसा कि टिप्पणियों में बताया गया है, <?xmlघोषणा तकनीकी रूप से वैकल्पिक है )।


एक्सएमएल तुलना अनुचित हो सकती है, क्योंकि एक्सएमएल दस्तावेज़ वैकल्पिक एक्सएमएल घोषणा के बिना पूरी तरह से मान्य है। पर एक्सएमएल सिफारिश देखें w3.org/TR/xml/#sec-well-formed
गुंथर

@Gunther आह, हाँ, मैं भूल गया कि यह तकनीकी रूप से वैकल्पिक है, हालांकि अत्यधिक प्रोत्साहित किया गया।
IMSoP

@Gunther: एक nitpick: <foo />एक है अच्छी तरह से गठित XML दस्तावेज़ नहीं, बल्कि एक वैध एक। (लेकिन ऐसा ही सच है <?xml version="1.0" ?><foo />।)
रुख २४'१३

@ruakh दिलचस्प बात यह है कि XML की परिभाषा का अर्थ केवल DTD के खिलाफ "वैध" हो सकता है, जिसका अर्थ है कि बहुत कम XML दस्तावेज़ हैं, क्योंकि DTDs बहुत कम ही लिखे जाते हैं और व्यवहार में घोषित होते हैं (स्कीमा परिभाषा प्रारूप जैसे XSD या RelaxNG की तुलना में) । मैं जाँच कर रहा था, क्योंकि यदि आप किसी बाहरी स्कीमा के विरुद्ध वैध <foo /> हो सकते हैं , तो उसे संदर्भित किए बिना, तो वह किसी विशेष स्कीमा के विरुद्ध मान्य हो भी सकती है और नहीं भी , लेकिन यह वह मानक स्थिति नहीं है।
IMSoP

4

संदर्भ के लिए एक्मा विनिर्देश उपयोगी हो सकता है:

http://www.ecma-international.org/ecma-262/5.1/

पार्स फ़ंक्शन एक JSON टेक्स्ट (एक JSON-स्वरूपित स्ट्रिंग) को पार्स करता है और एक ECMAScript मान उत्पन्न करता है। JSON प्रारूप ECMAScript शाब्दिक का प्रतिबंधित रूप है। JSON ऑब्जेक्ट्स को ECMAScript ऑब्जेक्ट्स के रूप में महसूस किया जाता है। JSON सरणियों को ECMAScript सरणियों के रूप में महसूस किया जाता है। JSON के तार, संख्या, बूलियन और नल को ECMAScript स्ट्रिंग्स, संख्या, बूलियन और नल के रूप में महसूस किया जाता है। JSON व्हाइटस्पेस की तुलना में सफेद अंतरिक्ष वर्णों के एक अधिक सीमित सेट का उपयोग करता है और यूनिकोड कोड पॉइंट्स U + 2028 और U + 2029 को सीधे भागने के क्रम का उपयोग किए बिना JSONString शाब्दिक में दिखाई देता है। पार्सिंग की प्रक्रिया 11.1.4 और 11.1.5 के समान है जो जेन्स व्याकरण द्वारा विवश है।

JSON.parse("string"); // SyntaxError: Unexpected token s
JSON.parse(43); // 43
JSON.parse("43"); // 43
JSON.parse(true); // true
JSON.parse("true"); // true
JSON.parse(false);
JSON.parse("false");
JSON.parse("trueee"); // SyntaxError: Unexpected token e
JSON.parse("{}"); // {}
JSON.parse("[]"); // []

4
जबकि एक उपयोगी संदर्भ, कि एक विशेष JSON पार्सर (ECMAScript मानक में परिभाषित एक) की विशिष्टता है प्रारूप के लिए ही नहीं। json.org स्पष्ट रूप से बताता है कि JSON "पूरी तरह से स्वतंत्र भाषा" है, इसलिए कोई भी सही पार्सर नहीं है।
IMSoP

1
जावास्क्रिप्ट / ECMAScipt JSON और इसके उपयोगकर्ता के लिए प्रेरणा है, लेकिन इसका "घर" नहीं है। JSON को ECMAScript के सभी शाब्दिक संस्करणों में ऑब्जेक्ट शाब्दिक अंकन से प्राप्त किया गया था, लेकिन यह इसके समान नहीं है। JSON.parseतब क्रॉकफोर्ड के व्याकरण और RFC पर आधारित ECMAScript मानक के बाद के संस्करणों में इस फ़ंक्शन को जोड़ा गया था।
IMSoP

4
आपको ऐसा करना चाहिएJSON.parse("\"string\"");
ericbn

4

JSON का अर्थ जावास्क्रिप्ट ऑब्जेक्ट नोटेशन है। केवल {}और []एक जावास्क्रिप्ट ऑब्जेक्ट परिभाषित करें। अन्य उदाहरण मूल्य शाब्दिक हैं। उन मानों के साथ काम करने के लिए जावास्क्रिप्ट में ऑब्जेक्ट प्रकार हैं, लेकिन अभिव्यक्ति "string"एक शाब्दिक मूल्य का स्रोत कोड प्रतिनिधित्व है न कि ऑब्जेक्ट।

ध्यान रखें कि JSON जावास्क्रिप्ट नहीं है। यह एक अंकन है जो डेटा का प्रतिनिधित्व करता है। इसकी एक बहुत ही सरल और सीमित संरचना है। JSON डेटा को {},:[]वर्णों का उपयोग करके संरचित किया जाता है। आप केवल उस संरचना के अंदर शाब्दिक मूल्यों का उपयोग कर सकते हैं।

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


1
मुझे लगता है कि इस दिशा से उत्तर आने से अधिक कीचड़ से यह स्पष्ट होता है: नाम की उत्पत्ति का मानक के विवरण पर कोई असर नहीं है, और जावास्क्रिप्ट में उपलब्ध प्रकार JSON के प्रकारों के लिए एक प्रेरणा हो सकते हैं, लेकिन कोई आवश्यकता नहीं है कि वे मेल खाते हैं। Json.org पर परिचय यह स्पष्ट करता है: "JSON एक पाठ प्रारूप है जो पूरी तरह से भाषा स्वतंत्र है"
IMSoP

@IMSoP मैं पूरी तरह से सहमत हूँ। मैंने जावास्क्रिप्ट टाइप JSON के साथ मिलाया और यह सही नहीं है। मैं अपना जवाब अपडेट करूंगा।
रिएक्टगुलर

2

हाँ, हाँ, हाँ, हाँ, और हाँ। वे सभी वैध JSON मान शाब्दिक हैं।

हालाँकि, आधिकारिक RFC 4627 बताता है:

JSON टेक्स्ट एक क्रमबद्ध ऑब्जेक्ट या सरणी है।

तो एक पूरी "फाइल" में सबसे बाहरी संरचना के रूप में एक वस्तु या सरणी होनी चाहिए, जो निश्चित रूप से खाली हो सकती है। फिर भी, कई JSON पार्सर आदिम मानों को इनपुट के लिए स्वीकार करते हैं।


-1
var x;
JSON.stringify(x); // will output "{}"

तो आपका जवाब है "{}"जो एक खाली वस्तु को दर्शाता है।


FWIW, क्रोम में, यह undefined"{}" नहीं देता है
मैट

-2

बस json.org पेज पर दिए गए रेलमार्ग आरेखों का पालन करें । [] और {} न्यूनतम संभव वैध JSON ऑब्जेक्ट हैं। तो जवाब है [] और {}।


3
यह एफएसएम नहीं है, यह एक व्याकरण है। और यह संकेत नहीं करता है कि उत्पादन किस नियम का प्रारंभ है। यदि प्रारंभ नियम थे arrayऔर objectआप सही होंगे, लेकिन यह valueशुरुआत होने की उम्मीद करना उचित है ।

हालांकि मेरे लिए काफी सीधा लगता है। डगलस क्रॉफोर्ड उन्हें कहते हैं कि और हम हमेशा बाएं से शुरू करते हैं और पटरियों को दाईं ओर फॉलो करते हैं। सबसे छोटा ट्रैक न्यूनतम वैध JSON देता है।
ऋषि

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

-1। सबसे पहले, जैसा कि @delnan बताते हैं, json.org पर आरेख में कुछ भी नहीं बताता है कि एक पूर्ण JSON पाठ एक ऑब्जेक्ट या सरणी होना चाहिए; आपने उन दो को मनमाने ढंग से उठाया है, json.org पर कुछ भी आधारित नहीं है। दूसरी बात, शब्दावली पर अधिपत्य:, []जबकि हर युक्ति के तहत एक मान्य JSON टेक्स्ट जो कि इस विषय पर एक राय है, "JSON ऑब्जेक्ट" नहीं है, क्योंकि यह JSON ऑब्जेक्ट नहीं है। JSON में "ऑब्जेक्ट" विशेष रूप से {}संकेतन को संदर्भित करता है; JSON सरणियाँ JSON ऑब्जेक्ट नहीं हैं।
मार्क अमेरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.