डेवलपर टूल · JSON फ़ॉर्मेटर और सत्यापनकर्ता
JavaScript ऑब्जेक्ट शाब्दिक बनाम JSON: एकल उद्धरण सत्यापन में विफल क्यों होते हैं
· यह काम किस प्रकार करता है
json डेवलपर-वर्कफ़्लो मान्यकरण
JavaScript कंसोल द्वारा मुद्रित कोई ऑब्जेक्ट JSON जैसा दिखता है, लेकिन आमतौर पर ऐसा नहीं होता है। यह पोस्ट सटीक अंतरों (उद्धरण, गैर-उद्धृत कुंजियाँ, अपरिभाषित, फ़ंक्शंस) को सूचीबद्ध करता है और दिखाता है कि प्रत्येक एक सत्यापनकर्ता के पास कहाँ जाता है।
यह कंसोल से निकला, तो यह अमान्य क्यों है?
यह कंसोल से निकला, तो यह अमान्य क्यों है? - डेवलपर कंसोल JavaScript मानों को JavaScript स्रोत-जैसे टेक्स्ट के रूप में प्रदर्शित करते हैं, गारंटीकृत JSON क्रमबद्धता के रूप में नहीं। कॉपी की गई वस्तु में नंगे गुण नाम, एकल-उद्धृत स्ट्रिंग, `undefined` या ब्राउज़र-विशिष्ट एनोटेशन शामिल हो सकते हैं। ये सभी JavaScript इंजन या मानव रीडर के लिए समझ में आ सकते हैं, जबकि `.json` फ़ाइल में तुरंत विफल हो जाते हैं, जिसका व्याकरण जानबूझकर छोटा होता है और निष्पादन योग्य कोड से स्वतंत्र होता है।
`{name: "Ada", active: true, missing: undefined}` पर विचार करें. ब्रेसिज़, कोलन और बूलियन JSON से मिलते जुलते हैं, लेकिन पहली नंगे कुंजी पहले से ही ऑब्जेक्ट-सदस्य नियम का उल्लंघन करती है, और `undefined` बाद में विफल हो जाएगी। ToolAcre एक पंक्ति और स्तंभ के साथ पहले असमर्थित वर्ण या मान की रिपोर्ट करता है, इसलिए रूपांतरण सबसे अच्छा क्रम में किया जाता है।
स्ट्रिंग्स को दोहरे उद्धरण चिह्नों का उपयोग करना चाहिए
स्ट्रिंग्स को दोहरे उद्धरण चिह्नों का उपयोग करना चाहिए - JSON एक स्ट्रिंग को `"` से घिरे वर्णों के रूप में परिभाषित करता है, जहां आवश्यक हो वहां बैकस्लैश एस्केप होता है। एक एकल उद्धरण की स्ट्रिंग सीमांकक के रूप में कोई भूमिका नहीं होती है। जब एक सत्यापनकर्ता `'Ada'` से मिलता है, तो वह एक स्ट्रिंग शुरू नहीं करता है और फिर उसकी सामग्री पर आपत्ति नहीं करता है; यह आरंभिक धर्मोपदेश को ही अस्वीकार कर देता है। यह संपत्ति के नाम और स्ट्रिंग मानों पर समान रूप से लागू होता है, भले ही JavaScript अपने स्वयं के शाब्दिक अर्थों के लिए किसी भी उद्धरण शैली की अनुमति देता है।
विश्व स्तर पर प्रत्येक एपॉस्ट्रॉफ़ी को बदलने की तुलना में उद्धरणों को परिवर्तित करने में अधिक देखभाल की आवश्यकता होती है। एक बार मान को दोहरा-उद्धृत करने पर `Ada's profile` जैसे पाठ के अंदर एक एपॉस्ट्रॉफी सामान्य सामग्री होती है, जबकि उस सामग्री के अंदर मौजूदा दोहरे उद्धरण चिह्नों से बचना चाहिए। वैध JSON फॉर्म `"Ada's "profile""` है।
कुंजियाँ उद्धृत स्ट्रिंग्स होनी चाहिए
कुंजियों को स्ट्रिंग उद्धृत किया जाना चाहिए - JavaScript ऑब्जेक्ट शाब्दिक पहचानकर्ता-शैली नाम जैसे `{name: 1}` और गणना किए गए नाम जैसे `{[expression]: 1}` की अनुमति देते हैं। JSON किसी भी शॉर्टहैंड की अनुमति नहीं देता है। एक प्रारंभिक ब्रेस या अल्पविराम के बाद, अगले सदस्य को एक डबल-उद्धृत स्ट्रिंग के साथ शुरू करना चाहिए, उसके बाद एक कोलन। वैध प्रतिनिधित्व `{"name": 1}` है। एक सत्यापनकर्ता जो `n` पर इंगित करता है वह सटीक स्थान की पहचान कर रहा है जहां उद्धरण की आवश्यकता थी।
प्रत्येक कुंजी को उद्धृत करने से रिक्त स्थान, हाइफ़न और आरक्षित शब्दों के आसपास अस्पष्टता भी दूर हो जाती है। JavaScript को उन मामलों के लिए भिन्न स्रोत सिंटैक्स की आवश्यकता हो सकती है, लेकिन JSON एक सुसंगत नियम का उपयोग करता है: `"display-name"`, `"first name"` और `"default"` सभी सामान्य सदस्य नाम हैं। संख्यात्मक दिखने वाली कुंजियाँ भी तार हैं।
JSON का बस कोई मूल्य नहीं है
मान JSON में बस नहीं है - इसकी मूल्य शब्दावली ऑब्जेक्ट, सरणी, स्ट्रिंग, संख्या, `true`, `false` और `null` है। कोई `undefined`, `NaN`, `Infinity`, फ़ंक्शन, रेगुलर एक्सप्रेशन, BigInt या Date शाब्दिक नहीं है। व्याकरण में टिप्पणियाँ अनुपस्थित हैं, और संख्याएँ हेक्साडेसिमल, बाइनरी, अग्रणी प्लस चिह्न या JavaScript संख्यात्मक विभाजक का उपयोग नहीं कर सकती हैं। प्रत्येक उधार लिया गया निर्माण अंततः एक ऐसे चरित्र तक पहुंचता है जो वैध JSON मान को शुरू या जारी नहीं रख सकता है।
रूपांतरण के लिए वर्तनी युक्ति के बजाय डेटा निर्णय की आवश्यकता होती है। `undefined` को `null` से तभी बदलें जब कोई स्पष्ट रिक्त मान एप्लिकेशन अनुबंध से मेल खाता हो; अन्यथा सदस्य को हटा दें या वास्तविक मूल्य प्रदान करें। तिथियों को सहमत स्ट्रिंग के रूप में एन्कोड करें, अक्सर ISO 8601। JSON टोकन का आविष्कार करने के बजाय प्राप्त API के अनुसार गैर-परिमित संख्याओं का प्रतिनिधित्व करें।
कारगर उदाहरण: कंसोल डंप को वैध JSON में परिवर्तित करना
कारगर उदाहरण: कंसोल डंप को वैध JSON में परिवर्तित करना - `{name: 'Ada', active: true, score: NaN, updated: new Date()}` से शुरू करें। दोहरे उद्धरण चिह्नों के साथ `name`, `active`, `score` और `updated` उद्धरण दें। नाम मान को दोहरे-उद्धृत स्ट्रिंग में बदलें। तय करें कि एक अनुपलब्ध स्कोर `null` होना चाहिए, और कंस्ट्रक्टर एक्सप्रेशन को उस वास्तविक टाइमस्टैम्प स्ट्रिंग से बदलें जिसे इसे उत्पन्न करना था। दस्तावेज़ में अब केवल JSON सदस्य और मान शामिल हैं।
तैयार आकार `{"name":"Ada","active":true,"score":null,"updated":"2026-03-21T10:00:00Z"}` हो सकता है। मरम्मत की प्रत्येक कैटेगरी के बाद सत्यापित करें क्योंकि पहली त्रुटि बाद में JavaScript-केवल सिंटैक्स को छिपा सकती है। स्वीकृत परिणाम को फ़ॉर्मेट करने से आगे कोई रूपांतरण किए बिना इसकी संरचना उजागर हो जाती है।
रिवर्स ट्रैप - मान्य JSON जिसे JavaScript अलग तरीके से पढ़ेगा, जैसे कि बहुत बड़े पूर्णांक और __proto__ कुंजी
रिवर्स ट्रैप - वैध JSON पार्सिंग के बाद भी JavaScript-विशिष्ट व्यवहार या सीमाएं प्राप्त कर सकता है। JSON संख्याओं की व्याकरण में कोई अंतर्निहित सटीक सीमा नहीं है, लेकिन JSON.parse JavaScript संख्या मान उत्पन्न करता है। इसलिए सुरक्षित सीमा से परे पूर्णांक को चुपचाप पूर्णांकित किया जा सकता है। यदि प्रत्येक अंक मायने रखता है, तो पहचानकर्ता को एक स्ट्रिंग के रूप में एनकोड करें या एक सफल सिंटैक्स जांच पर भरोसा करने के बजाय मनमानी-सटीक संख्याओं को संरक्षित करने के लिए डिज़ाइन किए गए पार्सर और डेटा प्रकार का उपयोग करें।
सदस्य का नाम `"__proto__"` भी मान्य है JSON और JSON.parse इसे अपनी डेटा प्रॉपर्टी के रूप में बनाता है। यदि एप्लिकेशन कोड असुरक्षित असाइनमेंट या मर्ज व्यवहार के साथ पार्स किए गए गुणों को किसी अन्य ऑब्जेक्ट में कॉपी करता है तो समस्या बाद में शुरू हो सकती है। सत्यापन साबित करता है कि पाठ JSON व्याकरण का पालन करता है; यह साबित नहीं करता कि प्रत्येक कुंजी प्रत्येक उपभोक्ता के लिए सुरक्षित है।
इसमें क्या शामिल नहीं है
इसमें क्या शामिल नहीं है - JSON5, JSONC और कॉन्फ़िगरेशन भाषाएं जो जानबूझकर टिप्पणियां, अनुवर्ती अल्पविराम, गैर-उद्धृत नाम या एकल-उद्धृत स्ट्रिंग स्वीकार करती हैं। वे प्रारूप विभिन्न संलेखन समस्याओं को हल करते हैं और ऐसे पार्सर्स की आवश्यकता होती है जो अपने स्वयं के व्याकरण को लागू करते हैं। एक सख्त JSON सत्यापनकर्ता को चुपचाप उनकी पुनर्व्याख्या नहीं करनी चाहिए, क्योंकि अतिरिक्त सिंटैक्स स्वीकार करने से APआई, पैकेज मेटाडेटा और अन्य गंतव्यों के लिए इसका परिणाम भ्रामक हो जाएगा, जिन्हें वास्तव में मानक JSON की आवश्यकता होती है।
यह भेद मनमाने JavaScript मूल्यांकन को भी बाहर रखता है। किसी ऑब्जेक्ट को डेटा में बदलने के लिए `eval` या फ़ंक्शन कंस्ट्रक्टर के माध्यम से चिपकाए गए टेक्स्ट को चलाने से गेटर्स, कॉल या अन्य शत्रुतापूर्ण अभिव्यक्तियां निष्पादित हो सकती हैं। यदि स्रोत आपके नियंत्रण में विश्वसनीय JavaScript है, तो वास्तविक मान को JSON.stringify के साथ क्रमबद्ध करें। यदि स्रोत अविश्वसनीय पाठ है, तो इसे निष्पादित न करें।
टेकअवे: शाब्दिक रूप से कोड है, JSON डेटा है
टेकवे: एक शाब्दिक कोड है, JSON डेटा है - दृश्य समानता उनके व्याकरण को विनिमेय नहीं बनाती है। JSON को दोहरे-उद्धृत स्ट्रिंग्स और सदस्य नामों की आवश्यकता होती है, केवल मूल्य प्रकारों के एक छोटे से निश्चित सेट की अनुमति होती है और इसमें कोई टिप्पणी या निष्पादन योग्य अभिव्यक्ति नहीं होती है। एक लाइन-एंड-कॉलम डायग्नोस्टिक उस पहले स्थान को चिह्नित करता है जहां कॉपी किया गया स्रोत उस व्याकरण को छोड़ता है। कंसोल डंप पर व्यापक खोज-और-प्रतिस्थापन को लागू करने की तुलना में उस बिंदु को सुधारना और फिर से मान्य करना अधिक विश्वसनीय है।
जब आप JavaScript मान को नियंत्रित करते हैं, तो इसके कंसोल प्रतिनिधित्व की प्रतिलिपि बनाने के बजाय JSON.stringify के साथ JSON उत्पन्न करें। जब आप पाठ प्राप्त करते हैं, तो इसे केवल घोषित प्रारूप के लिए पार्सर के साथ पार्स करें और इसे शॉर्टकट के रूप में कभी भी निष्पादित न करें। सफल JSON सत्यापन सिंटैक्स स्थापित करता है, न कि संख्यात्मक परिशुद्धता, स्कीमा अनुरूपता या सुरक्षित डाउनस्ट्रीम प्रॉपर्टी हैंडलिंग।