देर-सबेर हर डेवलपर वह त्रुटि देखता है जो बताती है कि JSON पार्स नहीं हो सका। संदेश अक्सर रूखा होता है — कोई स्थिति या वर्ण जिस पर पार्सर रुक गया — और पहली नज़र में कुछ साफ़ नहीं होता। अच्छी ख़बर यह है कि अमान्य JSON की वजहें आमतौर पर कुछ ही दोहराए जाने वाले पैटर्न में सिमटी होती हैं, और इन्हें पहचान लेना ज़्यादातर समस्याओं को मिनटों में हल कर देता है।
पहले यह तय करें कि डेटा वाक़ई JSON है या नहीं
सबसे आम और सबसे चूक जाने वाली ग़लती यह मान लेना है कि जो आया वह JSON ही है। अक्सर कोई सर्वर त्रुटि की स्थिति में HTML का एक पन्ना, एक सादा टेक्स्ट संदेश या एक ख़ाली प्रतिक्रिया लौटा देता है, और क्लाइंट उसे ज़बरदस्ती JSON की तरह पार्स करने की कोशिश करता है। पार्सर पहले वर्ण पर ही रुक जाता है।
इसलिए डिबगिंग की शुरुआत कच्ची प्रतिक्रिया को ज्यों का त्यों देखने से करें। अगर वह < से शुरू होती है, तो बहुत संभव है कि आपके पास JSON नहीं, बल्कि HTML त्रुटि-पृष्ठ है। यह जाँच अकेले बहुत-से रहस्यमय पार्स विफलताओं को समझा देती है।
छोटे विराम-चिह्न सबसे ज़्यादा सताते हैं
JSON के व्याकरण के नियम सख़्त हैं, और इन्हीं नियमों के छोटे उल्लंघन अधिकांश त्रुटियाँ पैदा करते हैं। अंत में लटका हुआ अल्पविराम, दो मानों के बीच ग़ायब अल्पविराम, बिना उद्धरण के कुंजी-नाम, या एकल उद्धरण का इस्तेमाल — ये सब आम अपराधी हैं। JSON में कुंजियाँ और स्ट्रिंग दोहरे उद्धरण में होनी चाहिए, और किसी सूची या ऑब्जेक्ट के अंत में फालतू अल्पविराम मान्य नहीं है।
ये ग़लतियाँ अक्सर तब आती हैं जब JSON हाथ से लिखा या जोड़ा जाता है। यही एक मज़बूत वजह है कि JSON को मैन्युअल रूप से जोड़ने के बजाय भरोसेमंद लाइब्रेरी से उत्पन्न किया जाए, ताकि व्याकरण अपने आप सही बने।
एन्कोडिंग और अदृश्य वर्ण
कभी-कभी JSON देखने में बिल्कुल सही लगता है पर फिर भी पार्स नहीं होता, और वजह छिपी हुई होती है। फ़ाइल की शुरुआत में एक अदृश्य बाइट-ऑर्डर मार्क, ग़लत कैरेक्टर एन्कोडिंग, या स्ट्रिंग के भीतर बिना एस्केप किए नियंत्रण-वर्ण — ये सब पार्सर को रोक सकते हैं और आँखों से नहीं दिखते।
जब डेटा सही दिखे पर फिर भी टूटे, तो उसकी कच्ची बाइट्स की जाँच करना उपयोगी होता है। अदृश्य वर्ण आम तौर पर तब घुसते हैं जब टेक्स्ट कई सिस्टमों से होकर गुज़रता है या किसी ऐसे संपादक में सहेजा जाता है जो छिपे हुए मेटाडेटा जोड़ देता है।
संख्याएँ हमेशा भरोसेमंद नहीं होतीं
JSON संख्याओं को लेकर एक सूक्ष्म समस्या है। फ़ॉर्मेट बड़ी संख्याओं की अनुमति देता है, पर कई भाषाओं में संख्याओं की परिशुद्धता सीमित होती है। एक बहुत बड़ा पहचानकर्ता पार्स होते समय अपनी सटीकता खो सकता है, जिससे डेटा ख़ामोशी से ग़लत हो जाता है — कोई त्रुटि नहीं फेंकी जाती, बस मान बदल जाता है।
यह ख़ास तौर पर ख़तरनाक है क्योंकि इसमें कोई पार्स विफलता नहीं दिखती। इससे बचने का सबसे सुरक्षित तरीक़ा है बड़े पहचानकर्ताओं को संख्या के बजाय स्ट्रिंग के रूप में भेजना, ताकि उनका हर अंक हूबहू सुरक्षित रहे।
सीमाओं पर ही गड़बड़ी सबसे ज़्यादा होती है
JSON अक्सर कई सीमाओं से गुज़रता है — एक सेवा से दूसरी, एक भाषा से दूसरी, एक एन्कोडिंग परत से दूसरी। हर सीमा पर रूपांतरण की संभावना है, और यहीं अधिकांश सूक्ष्म बग जन्म लेते हैं। एक परत स्ट्रिंग को एस्केप कर सकती है, दूसरी दोबारा एस्केप कर दे, और तीसरी इस दोहरी एस्केपिंग पर लड़खड़ा जाए।
ऐसी समस्याओं को सुलझाने का सबसे प्रभावी तरीक़ा है हर सीमा पर डेटा को देखना — उत्पादन के ठीक बाद, ट्रांसपोर्ट के ठीक पहले, और पाने वाले छोर पर ठीक बाद। यह तुलना आम तौर पर ठीक उसी परत की ओर इशारा कर देती है जहाँ डेटा बिगड़ा।
त्रुटि-संदेशों को ध्यान से पढ़ें
पार्सर की त्रुटियाँ भले रूखी लगें, पर वे अक्सर बहुमूल्य संकेत देती हैं — किस स्थिति या किस वर्ण पर पार्सिंग रुकी। उस स्थिति के आसपास के डेटा को देखना आम तौर पर असली समस्या तुरंत उजागर कर देता है, चाहे वह कटा हुआ पेलोड हो, कोई ग़लत वर्ण हो या अधूरी संरचना।
संदेश को अनदेखा करके अंधेरे में अनुमान लगाने के बजाय, उसमें दी स्थिति पर ध्यान दें। कई बार जिसे रहस्यमय विफलता समझा जाता है, वह बस इतनी बात होती है कि प्रतिक्रिया बीच में ही कट गई थी।
रक्षात्मक आदतें जो अमान्य JSON रोकती हैं
डिबगिंग का सबसे अच्छा तरीक़ा है उन समस्याओं को पहले ही रोक देना। JSON को हाथ से जोड़ने के बजाय भरोसेमंद लाइब्रेरी से उत्पन्न करें। पार्स करने से पहले जाँचें कि प्रतिक्रिया का कंटेंट-टाइप वाक़ई JSON है। बड़ी संख्याओं को स्ट्रिंग में रखें। और हर पार्सिंग को विफलता की संभावना मानकर संभालें, ताकि एक ख़राब प्रतिक्रिया पूरे अनुप्रयोग को न गिराए।
इन आदतों के साथ अमान्य JSON एक डरावना रहस्य नहीं रहता, बल्कि कुछ जाने-पहचाने पैटर्न में सिमट जाता है। उन पैटर्न को पहचानना ही असली कौशल है, और एक बार सीख लेने पर अधिकांश पार्स त्रुटियाँ कुछ ही मिनटों में हल हो जाती हैं।