डेवलपर टूल · JSON फ़ॉर्मेटर और सत्यापनकर्ता
संपूर्ण JSON व्याकरण एक पेज पर: छह मान प्रकार, दो कंटेनर
· पेजभूमि
json मानकों मान्यकरण
JSON का संपूर्ण व्याकरण एक पेज पर फिट बैठता है, और इसे दिल से जानने से प्रत्येक सत्यापनकर्ता त्रुटि स्पष्ट हो जाती है। यह पोस्ट छह मूल्य प्रकारों, दो कंटेनरों और कुछ नियमों के बारे में बताती है जो लोगों को परेशान करते हैं।
आपके द्वारा अब तक देखी गई प्रत्येक त्रुटि एक पेज से आती है
प्रत्येक वाक्यविन्यास त्रुटि एक संक्षिप्त व्याकरण में एक टूटी हुई अपेक्षा है। किसी ऑब्जेक्ट के खुलने के बाद, एक पार्सर एक उद्धृत सदस्य नाम या समापन ब्रेस की अपेक्षा करता है; एक नाम के बाद, यह एक कोलन की अपेक्षा करता है; किसी मान के बाद, यह अल्पविराम या कंटेनर के अंत की अपेक्षा करता है। रिपोर्ट किए गए चरित्र को रहस्यमय मानने की तुलना में किसी त्रुटि को विफल संक्रमण के रूप में पढ़ना अधिक उपयोगी है।
ToolAcre मानक JSON मान और रिक्त स्थान स्वीकार करता है, फिर दो व्यावहारिक इनपुट सीमाएँ लागू करता है। 8,000,000 वर्णों से अधिक लंबे टेक्स्ट को पार्सिंग से पहले अस्वीकार कर दिया जाता है, और 512 कंटेनरों से अधिक लंबे टेक्स्ट को अनिश्चित काल तक ट्रैवर्स करने के बजाय अस्वीकार कर दिया जाता है। वे उत्पाद सीमाएँ हैं, नए JSON प्रकार नहीं। उनके भीतर, निदान पहले बिंदु की पहचान करता है जहां टोकन स्ट्रीम अब व्याकरण को संतुष्ट नहीं कर सकती है।
छह मान - ऑब्जेक्ट, ऐरे, स्ट्रिंग, संख्या, true/false और null, और तथ्य यह है कि और कुछ नहीं है
JSON मान एक ऑब्जेक्ट, सरणी, स्ट्रिंग, संख्या, बूलियन या शून्य है। ऑब्जेक्ट और सरणियों में छह में से कोई भी हो सकता है, जिसमें अधिक कंटेनर भी शामिल हैं। शाब्दिक वर्तनी बिल्कुल `true`, `false` और `null` हैं; पूंजीकरण लचीला नहीं है. `True`, `None`, `undefined`, `NaN` और `Infinity` जैसे टोकन सख्त JSON से बाहर हैं, भले ही कोई अन्य भाषा उनमें से कुछ को पहचानती हो।
यह छोटी सूची वर्गीकरण को एक उपयोगी डिबगिंग तकनीक बनाती है। `{"reading": NaN}` में, कोलन सही ढंग से एक मान पेश करता है, लेकिन `N` कोई अनुमत मान शुरू नहीं कर सकता। यह तय करने के बाद ही इसे बदलें कि डेटा का क्या मतलब होना चाहिए, शायद `null` या उद्धृत स्थिति। एक सिंटैक्स टूल टोकन को अस्वीकार कर सकता है; यह एप्लिकेशन का विकल्प नहीं चुन सकता या यह तय नहीं कर सकता कि फ़ील्ड वहां है या नहीं।
ऑब्जेक्ट और सरणियाँ - अल्पविराम से अलग किए गए सदस्य, कोलन, और क्यों RFC 8259 कार्यान्वयन के लिए ऑर्डर और डुप्लिकेट नाम छोड़ देता है
ऑब्जेक्ट में अल्पविराम से अलग किए गए नाम/value सदस्य होते हैं। प्रत्येक नाम एक डबल-उद्धृत स्ट्रिंग है जिसके बाद एक कोलन और एक मान होता है। सारणी में अल्पविराम से अलग किए गए मान होते हैं जिनमें कोई नाम या कोलन नहीं होता है। खाली `{}` और `[]` कंटेनर मान्य हैं, लेकिन अल्पविराम आगे नहीं बढ़ सकता, पीछे नहीं हट सकता, या दो बार दिखाई नहीं दे सकता। प्रत्येक सीमांकक को उसके कंटेनर से मिलान करने से कई स्पष्ट "अप्रत्याशित टोकन" विफलताएँ तुरंत उजागर हो जाती हैं।
ऑब्जेक्ट नाम अद्वितीय होने की उम्मीद है, फिर भी इस सत्यापनकर्ता द्वारा डुप्लिकेट वर्तनी को अस्वीकार नहीं किया गया है। `{"port": 80, "port": 443}` पार्स, और `JSON.parse` बाद के मान को बरकरार रखता है। फ़ॉर्मेटिंग तब केवल उस जीवित सदस्य को उत्सर्जित करती है, इसलिए पहले वाले पाठ को परिणाम से पुनर्प्राप्त नहीं किया जा सकता है। सारणी की स्थिति अलग-अलग व्यवहार करती है: प्रत्येक तत्व मौजूद रहता है और उसका क्रम मूल्य का हिस्सा होता है।
तार और संख्याएँ सटीक रूप से
स्ट्रिंग्स दोहरे उद्धरण चिह्नों का उपयोग करती हैं। बैकस्लैश एक उद्धरण, बैकस्लैश, स्लैश, `b`, `f`, `n`, `r`, `t`, या चार-अंकीय यूनिकोड एस्केप प्रस्तुत कर सकता है; कच्चे नियंत्रण वर्ण वर्जित हैं. एकल उद्धरण एक स्ट्रिंग के बाहर सामान्य अमान्य टोकन हैं। ये नियम बताते हैं कि क्यों कॉपी किया गया JavaScript अक्षर और चिपकाया गया मल्टीलाइन टेक्स्ट सख्त JSON सत्यापन में विफल होने पर भी पढ़ने योग्य लग सकता है।
किसी संख्या में एक ऋण चिह्न, एक पूर्णांक भाग, एक वैकल्पिक भिन्न और एक वैकल्पिक घातांक हो सकता है। यह `+` से प्रारंभ नहीं हो सकता, हेक्साडेसिमल नोटेशन का उपयोग नहीं कर सकता, किसी अन्य अंक से पहले अग्रणी शून्य नहीं रख सकता, या किसी गैर-परिमित मान की वर्तनी नहीं कर सकता। `-0.25e+2` मान्य है; `01`, `.5`, `2.` और `Infinity` नहीं हैं। पार्सिंग व्याकरण की जाँच करती है, न कि यह कि क्या JavaScript प्रत्येक अंक को सटीक रूप से संरक्षित कर सकता है।
रिक्त स्थान और शीर्ष स्तर
बाहरी स्ट्रिंग्स, JSON व्हाइटस्पेस स्पेस, हॉरिजॉन्टल टैब, लाइन फीड और कैरिज रिटर्न तक सीमित है। किसी वेब पेज से कॉपी किया गया नॉन-ब्रेकिंग स्पेस सामान्य स्पेस के साथ विनिमेय नहीं है। फ़ॉर्मेटिंग टोकन के आस-पास अनुमत रिक्त स्थान के बीच स्वतंत्र रूप से चयन कर सकती है, लेकिन इसे उद्धृत स्ट्रिंग के अंदर मौजूद रिक्त स्थान को संरक्षित करना होगा क्योंकि वे वर्ण डेटा हैं।
संपूर्ण दस्तावेज़ कोई एकल JSON मान हो सकता है, न कि केवल एक ऑब्जेक्ट या सरणी। `42`, `false` और `"ready"` मान्य शीर्ष-स्तरीय पाठ हैं। पहले के बाद दूसरा मान वर्जित है: `42 43` दो दस्तावेज़ हैं, एक नहीं। यह अंतर बताता है कि क्यों न्यूलाइन-डीलिमिटेड JSON को संपूर्ण फ़ाइल के एक सामान्य पार्स के बजाय रिकॉर्ड-दर-रिकॉर्ड हैंडलिंग की आवश्यकता होती है।
व्यावहारिक उदाहरण: एक छोटे दस्तावेज़ को हाथ से पार्स करना
`{"order": [17, null, {"paid": true}], "note": "ship soon"}` लें। Root object में `order` member शुरू होता है; उसका value number, null और एक दूसरे object वाला array है। फिर comma `note` जोड़ता है, जिसका value escaped newline वाली string है। हर colon, comma और closing delimiter की एक grammatical भूमिका है।
अब `paid` से पहले का उद्धरण हटा दें। नेस्टेड ब्रेस के बाद, पार्सर एक क्लोजिंग ब्रेस या उद्धृत नाम की अपेक्षा करता है, इसलिए यह `p` पर विफल हो जाता है। वैकल्पिक रूप से, `true` के बाद अल्पविराम जोड़ें; पार्सर अल्पविराम स्वीकार करता है और फिर `}` पर विफल हो जाता है क्योंकि किसी अन्य सदस्य को इसका अनुसरण करना होगा। हाथ से उन स्थितियों की भविष्यवाणी करना सत्यापन को पुष्टि में बदल देता है और यादृच्छिक विराम चिह्न संपादन को हतोत्साहित करता है।
इसमें क्या शामिल नहीं है
व्याकरण में कोई दिनांक, दशमलव-धन, बाइनरी, UUID या अवधि प्रकार नहीं है। एप्लिकेशन आमतौर पर उन अवधारणाओं को स्ट्रिंग्स या संख्याओं के साथ प्रस्तुत करते हैं और सम्मेलनों को अलग से लागू करते हैं। एक टाइमस्टैम्प एक असंभव तारीख रखते हुए पूरी तरह से वैध JSON स्ट्रिंग हो सकता है। इसी तरह, एक वाक्यात्मक रूप से मान्य वस्तु आवश्यक गुणों को छोड़ सकती है या एकल पार्सिंग नियम का उल्लंघन किए बिना गलत इकाइयों का उपयोग कर सकती है।
ToolAcre स्कीमा जांच, डोमेन सत्यापन या कैनोनिकलाइज़ेशन नहीं करता है। यह JSON5 या JSONC सुविधाओं जैसे टिप्पणियों और अनुवर्ती अल्पविरामों की पुनर्व्याख्या भी नहीं करता है। इसका काम संकीर्ण है: उत्पाद सीमा के भीतर एक सख्त JSON टेक्स्ट स्वीकार करें, पार्स किए गए मान को प्रारूपित करें, और सिंटैक्स विफलताओं की पहचान करें। उपभोक्ता एप्लिकेशन की सत्यापन परत में आकार और अर्थ के बारे में बाद के प्रश्न रखें।
टेकअवे: व्याकरण याद रखें, स्थिति पर भरोसा करें
टिकाऊ चेकलिस्ट छोटी है: छह मूल्य श्रेणियां, उद्धृत ऑब्जेक्ट नाम, केवल वस्तुओं के बीच अल्पविराम, केवल नामों और मूल्यों के बीच कोलन, सख्त स्ट्रिंग एस्केप, सख्त संख्या वर्तनी, चार व्हाइटस्पेस वर्ण और बिल्कुल एक शीर्ष-स्तरीय मान। जब कोई दस्तावेज़ विफल हो जाता है, तो पहचानें कि रिपोर्ट की गई स्थिति से ठीक पहले व्याकरण ने क्या अनुमति दी है और उस अपेक्षा की तुलना वास्तव में मौजूद चरित्र से करें।
स्थिति को पहले असंभव बिंदु के रूप में मानें, हमेशा उस चरित्र पर नहीं जिसे हटाने की आवश्यकता है। एक समापन ब्रेस को हाइलाइट किया जा सकता है क्योंकि पूर्ववर्ती अल्पविराम ने किसी अन्य सदस्य का वादा किया था; एक निर्दोष पत्र को उजागर किया जा सकता है क्योंकि उसका प्रारंभिक उद्धरण गायब है। कारण सुधारें, सत्यापन पुनः चलाएँ और दोहराएँ। बड़े आकार या बेहद गहरे इनपुट के लिए, सिंटैक्स डायग्नोस्टिक्स से मदद मिलने से पहले 8-मिलियन-कैरेक्टर या 512-गहराई उत्पाद सीमा का पता लगाएं।