JSON फ़ॉर्मैटर और वैलिडेटर

JSON को फ़ॉर्मैट, वैलिडेट और जाँचें — त्रुटि ठीक उसी अक्षर पर इशारा करती है।

आउटपुट
{
  "name": "jaguar",
  "speed_kph": 80,
  "habitats": [
    "rainforest",
    "wetland"
  ],
  "conservation": {
    "status": "Near Threatened",
    "assessed": 2016
  },
  "nocturnal": null
}

मान्य JSON

आकार
145 B
मिनिफ़ाइड
145 B
बचा
0%
कुंजियाँ
7
ऑब्जेक्ट
2
अधिकतम गहराई
3

चार ग़लतियाँ

ठुकराया गया लगभग हर दस्तावेज़ इन्हीं गिनी-चुनी वजहों में से किसी एक पर अटकता है, और चारों ऐसी चीज़ें हैं जिन्हें जावास्क्रिप्ट मान लेती। जाल यही है: JSON देखने में जावास्क्रिप्ट के ऑब्जेक्ट लिटरल जैसा लगता है, और असल में उसका कहीं ज़्यादा सख़्त उपसमुच्चय है।

जो लिखा गयासमस्यासही रूप
{"a": 1,}आख़िर में फ़ालतू कॉमा{"a": 1}
{'a': 1}इकहरे उद्धरण चिह्न{"a": 1}
{a: 1}बिना उद्धरण वाली कुंजी{"a": 1}
{"a": 1} // noteटिप्पणीउसे हटा दीजिए

दो और, जिनमें लोग कम फँसते हैं पर जिन्हें पकड़ना ज़्यादा मुश्किल है। NaN, Infinity और undefined — तीनों वैध जावास्क्रिप्ट मान हैं और इनमें से कोई भी JSON का मान नहीं है; इनकी जगह null या कोई स्ट्रिंग आती है। और स्ट्रिंग के भीतर सचमुच की नई पंक्ति अमान्य है; वहाँ \n — यानी दो अक्षर — होने चाहिए।

यह वैलिडेटर त्रुटियाँ कैसे बताता है

इसे समझाना ज़रूरी है, क्योंकि एक फ़ॉर्मैटर को दूसरे पर चुनने की वजह यही है। सफल रास्ते के लिए ब्राउज़र का अपना JSON.parse इस्तेमाल होता है, पर नाकामी बताने के लिए नहीं: उसका संदेश-रूप एक कार्यान्वयन विवरण है जो हाल के V8 रिलीज़ में दो बार बदल चुका है। वही टूटा दस्तावेज़ एक Node संस्करण पर «Unexpected end of JSON input» बताता है और दूसरे पर «Expected ‘,’ or ‘}’ after property value at position 6», और कभी-कभी स्थिति बताता ही नहीं।

इसलिए पार्सिंग नाकाम होने पर यह पेज ख़ुद व्याकरण पर चलता है और बताता है कि वह किस पंक्ति, किस स्तंभ और किस अक्षर पर रुका — नीचे एक निशान लगाकर। आपको जो संदेश मिलेगा वह इस पर निर्भर नहीं करेगा कि आप कौन-सा ब्राउज़र इस्तेमाल कर रहे हैं।

परिशुद्धता की वह समस्या जिसकी चेतावनी कोई नहीं देता

यह असली बग पैदा करती है और इसका ज़िक्र लगभग कभी नहीं होता। JSON के अंक जावास्क्रिप्ट के अंक बन जाते हैं, और जावास्क्रिप्ट के अंक IEEE 754 डबल हैं। 2⁵³ — मोटे तौर पर 9.007 क्वाड्रिलियन — से बड़े पूर्णांक ठीक-ठीक दर्शाए ही नहीं जा सकते।

ट्विटर, Discord और ज़्यादातर Snowflake-शैली की ID योजनाएँ जिस तरह के 19 अंकों वाले पहचानकर्ता बनाती हैं, वे बदले हुए लौटेंगे — चुपचाप, और कहीं कोई त्रुटि नहीं। ऊपर वाले फ़ॉर्मैटर में {"id": 9007199254740993} चिपकाइए और देखिए आख़िरी अंक कैसे खिसक जाता है।

इसका इलाज भेजने वाले सिरे पर है: 64-बिट पहचानकर्ताओं को स्ट्रिंग के रूप में भेजिए। जिस भी API को यह काट चुका है, वह अब यही करता है।

कब कुछ और उठाना चाहिए

यह पेज उस दस्तावेज़ को पढ़ने और ठीक करने के लिए है जो आपके सामने है। दो पड़ोसी कामों के लिए यह ग़लत औज़ार है:

  • क्वेरी करना और बदलना। उसके लिए कमांड लाइन पर jq है, जो सब कुछ मेमोरी में लादने के बजाय स्ट्रीम भी करता है — कुछ मेगाबाइट से बड़ी हर चीज़ के लिए सही जवाब यही है।
  • ढाँचा लागू करना। वह JSON Schema है, और ढाँचे की जाँच वाक्य-रचना की जाँच से अलग सवाल है। कोई दस्तावेज़ बिलकुल सही बना हो सकता है और फिर भी उसमें आपके API की माँगी हर फ़ील्ड ग़ायब हो सकती है।

संबंधित

अगर JSON Base64 में एन्कोड होकर आया है तो पहले उसे डिकोड कीजिए। अगर वह किसी टोकन से निकला है तो JWT डिकोडर दोनों हिस्सों को आपके लिए अलग करके पार्स कर देगा। और अगर उसे किसी URL में जाना है तो URL एन्कोडर बताएगा कि तीन एस्केपिंग नियमों में से आपको कौन-सा चाहिए।

JSON से जुड़े सवाल

मेरा JSON देखने में ठीक है, फिर भी नाकाम क्यों होता है?

लगभग सब कुछ चार वजहों से होता है। बंद करने वाले कोष्ठक से पहले फ़ालतू कॉमा, जिसे जावास्क्रिप्ट मान लेता है और JSON नहीं। दोहरे की जगह इकहरे उद्धरण चिह्न। टिप्पणियाँ, जिनके लिए JSON में कोई वाक्य-रचना है ही नहीं। और बिना उद्धरण वाली कुंजियाँ — {name: "x"} वैध जावास्क्रिप्ट है और अवैध JSON। ऊपर वाला वैलिडेटर पार्सर की त्रुटि दोहराने के बजाय बताता है कि इनमें से कौन-सी उसे मिली।

क्या यहाँ प्रोडक्शन डेटा चिपकाना सुरक्षित है?

इस पेज में हाँ — यह आपके ब्राउज़र में पार्स होता है और ऐसा कोई रिक्वेस्ट है ही नहीं जो उसे ले जा सके। टाइप करते हुए नेटवर्क टैब देखकर आप ख़ुद पुष्टि कर सकते हैं। फिर भी यह आदत आम तौर पर बनाए रखने लायक़ है: लोग जो JSON डीबग करते हैं वह अक्सर असली API रिस्पॉन्स होता है जिसमें असली ग्राहक रिकॉर्ड होते हैं, और कई ऑनलाइन फ़ॉर्मैटर काम करवाने के लिए उसे सर्वर पर भेज देते हैं। कोई भी टूल हो, चिपकाने से पहले जाँच लीजिए।

क्या JSON में टिप्पणियाँ हो सकती हैं?

नहीं। डगलस क्रॉकफ़र्ड ने उन्हें जान-बूझकर हटाया, क्योंकि लोग उनमें पार्सिंग निर्देश डालने लगे थे। कॉन्फ़िग फ़ाइल में टिप्पणियाँ चाहिए तो आम जवाब हैं JSON5 या JSONC (जिसे VS Code इस्तेमाल करता है), या फिर परिपाटी — एक "_comment" कुंजी जिसे इस्तेमाल करने वाले अनदेखा कर दें। इनमें से कोई भी JSON नहीं है, इसलिए सख़्त पार्सर उन्हें फिर भी ठुकरा देगा।

«कुंजियाँ क्रम में लगाना» क्या करता है और मुझे यह क्यों चाहिए?

यह हर ऑब्जेक्ट की कुंजियों को वर्णक्रम में, भीतर तक जाकर दोबारा जमा देता है। विनिर्देश के अनुसार JSON ऑब्जेक्ट क्रमरहित होते हैं, इसलिए जो दो दस्तावेज़ सिर्फ़ कुंजियों के क्रम में अलग हैं वे समतुल्य हैं — पर टेक्स्ट डिफ़ हर पंक्ति को बदली हुई दिखा देता है। तुलना से पहले दोनों को क्रम में लगा देने पर यह सिमटकर सिर्फ़ उन्हीं फ़र्क़ों तक रह जाता है जो सचमुच मायने रखते हैं।

क्या आकार की कोई सीमा है?

सिर्फ़ आपके ब्राउज़र की। पार्सिंग पेज में ही होती है, इसलिए डेस्कटॉप पर कुछ मेगाबाइट ठीक हैं और पुराने फ़ोन को मेहनत करनी पड़ेगी। बहुत बड़े दस्तावेज़ कमांड लाइन पर jq से सँभालना बेहतर है, जो पूरा पेड़ मेमोरी में रखने के बजाय स्ट्रीम करता है।

मेरा बड़ा पूर्णांक ग़लत होकर क्यों लौटता है?

क्योंकि JSON के अंक जावास्क्रिप्ट के अंक बन जाते हैं, जो IEEE 754 डबल हैं, और वे 2⁵³ — लगभग 9.007 क्वाड्रिलियन — से ऊपर परिशुद्धता खो देते हैं। ट्विटर जैसी 19 अंकों की ID या डेटाबेस का bigint हल्के-से बदला हुआ लौटेगा। यह फ़ॉर्मैटर की ख़ामी नहीं है; यही वजह है कि 64-बिट ID इस्तेमाल करने वाले API उन्हें स्ट्रिंग के रूप में भेजते हैं।

अंतिम समीक्षा । कुछ पुराना पड़ा हुआ मिला? हमें बताइए.