आँकड़ों और विज्ञापन के लिए कुकीज़
हम आँकड़ों और विज्ञापन के लिए कुकीज़ इस्तेमाल करते हैं, दोनों Google को जाती हैं। मना करने से आपको दिखने वाली किसी चीज़ में कोई फ़र्क़ नहीं पड़ता।निजता पेज पढ़ें
वह दस्तावेज़ चिपकाइए जिसे कोई चीज़ मना कर रही है और पता कीजिए कि वह कहाँ अटकती है। «अवैध» कह देना काफ़ी नहीं है: यहाँ पंक्ति, कॉलम और टेक्स्ट का वह टुकड़ा मिलता है जिस पर बिंदु का निशान लगा हो, क्योंकि parser का संदेश आम तौर पर उस जगह की ओर इशारा करता है जहाँ उसे पता चला, न कि उस जगह की ओर जहाँ ग़लती है। कुछ अपलोड नहीं होता।
कहाँ चलता है
कुछ भी अपलोड नहीं होता, क्योंकि कोई फ़ाइल है ही नहीं — गणना इसी पन्ने में होती है।
न कतार, न खाता
यह उतनी ही तेज़ी से जवाब देता है जितनी आपकी मशीन देती है, और कभी नहीं पूछता कि आप कौन हैं।
जितनी बार चाहें
न कुछ गिना जाता है, न कोई सीमा है — दोबारा जवाब देने में हमारा कुछ ख़र्च नहीं होता।
JSON का parser उसी क्षण रुक जाता है जब उसे कुछ ऐसा मिलता है जो बैठता नहीं, और वह जगह अक्सर असली ग़लती से काफ़ी बाद होती है। पंक्ति 12 पर छूटा हुआ अल्पविराम पंक्ति 13 पर पकड़ में आता है, जब वहाँ अल्पविराम की जगह उद्धरण-चिह्न दिखता है; संदेश 13 की ओर इशारा करता है।
इसीलिए यहाँ सिर्फ़ एक संख्या नहीं निकलती बल्कि निशान लगा हुआ टुकड़ा भी। संदर्भ देख लेना ही «कॉलम 4» को «ऊपर वाली पंक्ति का अल्पविराम छूटा है» में बदलता है, और यही फ़र्क़ है दस सेकंड में सुधार लेने और दो सौ पंक्तियों के दस्तावेज़ को घूरते रहने के बीच।
वही टूटा हुआ दस्तावेज़ Chrome, Firefox और Safari में अलग-अलग संदेश देता है, क्योंकि हर JavaScript इंजन अपने संदेश ख़ुद लिखता है। कुछ स्थिति को अक्षरों की गिनती के रूप में देते हैं, कुछ स्थिति देते ही नहीं।
यहाँ पंक्ति और कॉलम संदेश के शब्दों पर भरोसा करने के बजाय उसी गिनती से निकाले जाते हैं। इससे जवाब हर ब्राउज़र में एक जैसा रहता है, जो ऐसे औज़ार से कम से कम माँगा ही जा सकता है जिसका पूरा काम आपको यह बताना है कि कहाँ देखना है।
किसी बंद कोष्ठक से पहले एक अतिरिक्त अल्पविराम; दो तत्वों के बीच छूटा हुआ अल्पविराम; दोहरे के बजाय इकहरे उद्धरण-चिह्न; और बिना उद्धरण वाली कुंजी। मना किए गए दस्तावेज़ों का भारी बहुमत इन्हीं चार में आ जाता है, और चारों JSON को JavaScript की तरह लिखने से पैदा होते हैं।
पाँचवाँ ज़्यादा धोखेबाज़ है: दस्तावेज़ की शुरुआत में एक अदृश्य अक्षर, लगभग हमेशा वह byte order mark जिसे Excel और Windows के कुछ एडिटर सबसे आगे रख देते हैं। दस्तावेज़ बिलकुल ठीक दिखता है और parser कॉलम 1 पर विफल होता है, यानी ठीक उस जगह जहाँ कोई देखता नहीं।
किसी दस्तावेज़ का वैध JSON होना सिर्फ़ इतना कहता है कि उसका वाक्य-विन्यास ठीक है, और कुछ नहीं। जो फ़ील्ड संख्या होना चाहिए था और स्ट्रिंग बनकर आया, ऐसे रूप में लिखी तारीख़ जिसकी दूसरा पक्ष उम्मीद नहीं करता, या ऐसा object जिसमें आधी कुंजियाँ ही नहीं हैं — ये सब यह जाँच बिना अटके पार कर जाते हैं।
अगर कोई API यहाँ वैध निकले दस्तावेज़ को फिर भी मना कर रही है, तो दिक़्क़त वाक्य-विन्यास की नहीं रही: वह schema की है। उसे JSON Schema का validator उसी API के schema के सामने जाँचता है, और वह अलग सवाल है जो ठीक वहाँ से शुरू होता है जहाँ यह पन्ना ख़त्म होता है।
बीच में tab रखकर कॉलम गिनना दुविधा भरा है: tab एक अक्षर है, पर स्क्रीन पर एडिटर की सेटिंग के हिसाब से चार या आठ जगह घेरता है। अक्षरों पर निकाला गया कॉलम-नंबर तब उस चीज़ से मेल नहीं खाता जो दिखती है।
यहाँ अक्षर गिने जाते हैं, जो parser भी करता है, और टुकड़ा tab खोलकर दिखाया जाता है ताकि निशान वहीं गिरे जहाँ आँख उसकी उम्मीद करती है। यह बहुत छोटा-सा ब्योरा है और मदद करने वाले संकेत तथा भ्रमाने वाले संकेत के बीच का पूरा फ़र्क़ है।
JavaScript का parser स्थिति UTF-16 इकाइयों में गिनता है, और एक दिखने वाला हिंदी अक्षर आम तौर पर कई code point का होता है: «क्षि» में क, ्, ष और ि — चार। इसलिए हिंदी सामग्री वाली पंक्ति में parser का कॉलम-नंबर उस स्थान से बड़ा होता है जिसे आप आँख से गिनते हैं।
इसीलिए यहाँ निशान लगे टुकड़े पर ज़ोर है, अकेली संख्या पर नहीं। जिस पंक्ति में हिंदी टेक्स्ट हो वहाँ «कॉलम 47» अपने आप में लगभग बेकार है; निशान लगा टुकड़ा वहाँ भी उतना ही काम करता है जितना सादे ASCII में, और यही एकमात्र वजह है कि दोनों दिए जाते हैं।
जब दस्तावेज़ पार हो जाता है तो उसका आकार भी निकलता है: ऊपरी स्तर object है या array, कितनी कुंजियाँ हैं, कितना नेस्टिंग है और आकार कितना है। ये वही आँकड़े हैं जिन्हें कोई यह तय करने से पहले देखता है कि उसे प्रोसेस कैसे करना है।
चारों में सबसे काम का नेस्टिंग की गहराई है। बहुत से parser और बहुत सी API की अपनी सीमा होती है, और अपने-आप बनने वाला दस्तावेज़ उसे बिना किसी की जानकारी के पार कर सकता है। यह वह संख्या है जिसे कोई कभी नहीं देखता, उस दिन तक जब वह किसी ऐसी त्रुटि की व्याख्या कर देती है जिसका कोई तुक नहीं बैठ रहा था।
अगर दस्तावेज़ में ऐसा पूर्णांक है जो ठीक-ठीक बना रहने के लिए बहुत बड़ा है, तो यह बताया जाता है, भले ही दस्तावेज़ पूरी तरह वैध हो। यह वाक्य-विन्यास की त्रुटि नहीं है: यह पढ़ते समय होने वाला चुपचाप नुक़सान है, और वह हर उस तंत्र में उसी तरह होता है जो JavaScript का parser इस्तेमाल करता है।
इसकी अपनी चेतावनी बनती है क्योंकि इसका निदान सबसे बुरा होता है। दस्तावेज़ ठीक भीतर जाता है, ठीक बाहर आता है, और बीच में किसी पहचान-संख्या के आख़िरी अंक बदल जाते हैं — और उसे पाने वाला तंत्र रिकॉर्ड नहीं ढूँढ़ पाता, बिना इस बात के किसी संकेत के कि क्यों।
यह पन्ना एक सवाल का जवाब देता है, दो का नहीं: कहाँ विफल होती है। दस्तावेज़ को indent के साथ देखना format वाले पन्ने का काम है, जिसके पास indent चुनने और कुंजियाँ क्रम में लगाने के वे विकल्प भी हैं जिनका यहाँ कोई मतलब नहीं।
यह वही फ़ैसला है जो इस पूरे हिस्से में encode को decode से अलग रखता है। जो यहाँ आता है उसके पास कुछ टूटा हुआ है और उसे जगह चाहिए; जो वहाँ जाता है उसके पास कुछ अपठनीय है और उसे देखना है। जोड़ने पर ऐसा पन्ना बनता जिसका आधा हिस्सा दोनों में से हर एक के लिए फ़ालतू होता।
JSON में `NaN`, `Infinity` और `undefined` जैसा कुछ है ही नहीं। JavaScript में ये तीनों बनते हैं, इसलिए किसी गणना का नतीजा सीधे किसी दस्तावेज़ में लिखे जाने पर या तो उसे अवैध बना देता है या — और यह ज़्यादा बुरा है — चुपचाप बदल जाता है।
`JSON.stringify` `NaN` और `Infinity` को `null` लिख देता है, और `undefined` वाली कुंजी को पूरी तरह छोड़ देता है। दस्तावेज़ वैध निकलता है, यह पन्ना उसे पार कर देता है, और दूसरी तरफ़ किसी फ़ील्ड में `null` बैठा है या वह फ़ील्ड है ही नहीं। अगर कोई कुंजी बिना किसी वजह के ग़ायब हो रही है, तो उसे बनाने वाली गणना पहली जगह है जहाँ देखना चाहिए।
जिस दस्तावेज़ को कोई चीज़ मना कर रही है वह आम तौर पर असली दस्तावेज़ होता है: कोई ऑर्डर, कोई ग्राहक-रिकॉर्ड, नाम-पते वाला किसी webhook का शरीर। चूँकि जाँच पन्ने पर ही होती है, उसमें से कुछ भी हम तक नहीं पहुँचता और न हमारे किसी रिक्वेस्ट लॉग में रहता है।
यह ठीक वही हालत है जिसे कोई आंतरिक नीति रोकना चाहती है — debug करने के लिए निजी डेटा किसी तीसरे पक्ष की सेवा में चिपका देना — और यहाँ वह बनती ही नहीं, क्योंकि पाने वाला कोई तीसरा पक्ष है ही नहीं। नेटवर्क पैनल इस्तेमाल के दौरान यह दिखा देता है।
यह सामान्य है: parser वहाँ रुकता है जहाँ चीज़ें बैठना बंद करती हैं, वहाँ नहीं जहाँ कारण है। 12 पर छूटा अल्पविराम 13 पर पकड़ा जाता है। इसीलिए यहाँ सिर्फ़ संख्या नहीं, निशान लगा टुकड़ा भी मिलता है।
तब दिक़्क़त वाक्य-विन्यास की नहीं, schema की है: किसी फ़ील्ड का प्रकार ग़लत, तारीख़ किसी और रूप में, कोई कुंजी ग़ायब। उसे उसी API के schema के सामने JSON Schema का validator जाँचता है।
लगभग तय है कि दस्तावेज़ से पहले एक अदृश्य byte order mark पड़ा है, जिसे Excel या Windows का कोई एडिटर लगा देता है। फ़ाइल को दोबारा UTF-8 में, BOM के बिना सहेज लीजिए।
क्योंकि उसमें ऐसा पूर्णांक है जो पढ़े जाते समय ठीक-ठीक बना रहने के लिए बहुत बड़ा है। वह वैध है और फिर भी अंक खोता है, यहाँ भी और JavaScript का parser इस्तेमाल करने वाले हर तंत्र में भी। ऐसे मान को स्ट्रिंग के रूप में चलना चाहिए।
नहीं। जाँच इसी पन्ने पर होती है। यह मायने रखता है, क्योंकि जिस दस्तावेज़ को कोई चीज़ मना कर रही होती है वह आम तौर पर असली होता है, भीतर लोगों के डेटा के साथ।