अमान्य JSON ठीक करने के लिए उसे किसी JSON वैलिडेटर में पेस्ट करें, बताई गई लाइन पर जाएँ, और बताई गई जगह से ठीक पहले वाले कैरेक्टर को देखें। दस में से नौ बार गड़बड़ी की वजह आखिरी कॉमा, सिंगल कोट, बिना कोट की की (key), कोई कमेंट या गायब ब्रैकेट होती है। अगर एरर में पोज़िशन 0 पर Unexpected token < लिखा है, तो समस्या आपके JSON में है ही नहीं: आपको उसकी जगह एक HTML पेज मिला है। यह गाइड हर आम JSON एरर, उसके संदेश का असली मतलब और उसे ठीक करने का सटीक तरीका बताती है।
JSON इतना सख्त क्यों है
JSON (JavaScript Object Notation) JavaScript जैसा दिखता है, लेकिन इसका व्याकरण बहुत छोटा और सख्त है। इसका मानक, RFC 8259, सिर्फ़ कुछ ही हिस्सों की अनुमति देता है: { } में ऑब्जेक्ट, [ ] में ऐरे, डबल कोट में स्ट्रिंग, नंबर, true, false और null। इसके अलावा कुछ भी, यहाँ तक कि वह सिंटैक्स भी जिसे JavaScript या Python आराम से मान लेते हैं, पूरे दस्तावेज़ को अमान्य बना देता है।
यह सख्ती एक खूबी है। क्योंकि हर पार्सर नियमों के एक ही छोटे सेट पर सहमत है, इसलिए एक भाषा में लिखा JSON किसी भी दूसरी भाषा में भरोसे से पढ़ा जा सकता है। नुकसान यह है कि एक गलत कैरेक्टर सब कुछ तोड़ देता है, और पार्सर आमतौर पर पहली समस्या पर ही रुक जाते हैं।
अमान्य JSON को कदम-दर-कदम कैसे ठीक करें
- सटीक टेक्स्ट कॉपी करें। मूल इनपुट लें, ऐसा वर्ज़न नहीं जिसे आप पहले ही ठीक कर चुके हैं। अगर यह किसी API से आया है, तो रिस्पॉन्स बॉडी को ठीक वैसे ही कॉपी करें जैसा मिला था।
- वैलिडेटर में पेस्ट करें। JSON वैलिडेटर और ब्यूटीफ़ायर खोलें, टेक्स्ट पेस्ट करें और सबमिट करें।
- बताई गई जगह खोजें। एरर संदेश में दी गई लाइन, कॉलम या पोज़िशन नोट करें।
- थोड़ा बाईं ओर देखें। बताई गई पोज़िशन वह जगह है जहाँ पार्सर ने हार मानी, जो अक्सर असली गलती से एक-दो कैरेक्टर आगे होती है। उदाहरण के लिए, आखिरी कॉमा की गलती आमतौर पर उसके बाद आने वाले क्लोज़िंग ब्रैकेट पर बताई जाती है।
- एक एरर ठीक करें और फिर से जाँचें। पार्सर सिर्फ़ पहली समस्या बताते हैं, इसलिए इनपुट पास होने तक दोहराते रहें।
- नतीजे को ब्यूटीफ़ाई करें। वैध होने के बाद, फ़ॉर्मेट और इंडेंट किया हुआ वर्ज़न यह पक्का करना बहुत आसान बना देता है कि स्ट्रक्चर वैसा ही है जैसा आप चाहते थे।
10 सबसे आम JSON एरर और उन्हें कैसे ठीक करें
1. आखिरी कॉमा (trailing comma)
किसी ऑब्जेक्ट या ऐरे के आखिरी आइटम के बाद कॉमा सबसे आम JSON गलती है, क्योंकि JavaScript कोड इसकी अनुमति देता है और कई एडिटर इसे छोड़ देते हैं।
{"name": "Ada", "role": "admin",} // अमान्य
{"name": "Ada", "role": "admin"} // मान्य
समाधान: क्लोज़िंग } या ] से पहले का कॉमा हटा दें।
2. सिंगल कोट
JSON की स्ट्रिंग और की में डबल कोट होने चाहिए। सिंगल कोट JavaScript और Python में चलते हैं, लेकिन JSON में नहीं।
{'name': 'Ada'} // अमान्य
{"name": "Ada"} // मान्य
समाधान: की और वैल्यू के आसपास के सिंगल कोट को डबल कोट से बदलें। टेक्स्ट के अंदर के एपॉस्ट्रॉफ़ी, जैसे "it's", से सावधान रहें, वे सही हैं और रहने चाहिए।
3. बिना कोट की की
हर प्रॉपर्टी का नाम कोट में लिखी स्ट्रिंग होना चाहिए।
{name: "Ada"} // अमान्य
{"name": "Ada"} // मान्य
4. गायब कॉमा
जब दो वैल्यू बिना कॉमा के एक साथ होती हैं, तो पार्सर दूसरी वैल्यू पर शिकायत करता है। ऐसा अक्सर फ़ाइल को हाथ से बदलने या दो हिस्सों को जोड़ने के बाद होता है।
{"a": 1 "b": 2} // अमान्य
{"a": 1, "b": 2} // मान्य
समाधान: पिछली वैल्यू के ठीक बाद, एरर वाली पोज़िशन से ठीक पहले कॉमा जोड़ें।
5. कमेंट
मानक JSON में कमेंट नहीं होते। // ... और /* ... */ दोनों अमान्य हैं। कुछ टूल कॉन्फ़िग फ़ाइलों के लिए ढीले फ़ॉर्मेट (JSONC या JSON5) इस्तेमाल करते हैं, जो कमेंट और आखिरी कॉमा की अनुमति देते हैं, लेकिन सख्त JSON पार्सर इन्हें अस्वीकार कर देगा।
समाधान: कमेंट हटा दें, या अगर पाने वाला प्रोग्राम अनजान की को नज़रअंदाज़ करता है तो नोट को "_comment": "..." जैसे सामान्य फ़ील्ड में रखें।
6. Python या JavaScript की वैल्यू
JSON सिर्फ़ छोटे अक्षरों वाले true, false और null को जानता है। Python के True, False और None अमान्य हैं, और JavaScript के undefined, NaN और Infinity भी।
समाधान: इन्हें JSON के बराबर रूपों में बदलें, और NaN जैसी वैल्यू को null या स्ट्रिंग बनाएँ। अगर आप Python डिक्शनरी प्रिंट कर रहे हैं, तो print() या str() की जगह json.dumps() इस्तेमाल करें, क्योंकि वे Python सिंटैक्स बनाते हैं, JSON नहीं।
7. दस्तावेज़ों और चैट ऐप से आए स्मार्ट कोट
वर्ड प्रोसेसर, स्लाइड डेक या मैसेजिंग ऐप से कॉपी किए टेक्स्ट में अक्सर सीधे कोट (") की जगह घुमावदार कोट (“ ”) होते हैं। ये लगभग एक जैसे दिखते हैं, लेकिन अलग कैरेक्टर हैं।
समाधान: की और वैल्यू के आसपास के घुमावदार कोट को सीधे डबल कोट से बदलें, और जहाँ तक हो सके, कोड सादे टेक्स्ट वाले सोर्स से कॉपी करें।
8. स्ट्रिंग के अंदर गलत एस्केप और लाइन ब्रेक
बैकस्लैश एक एस्केप सीक्वेंस शुरू करता है, इसलिए "C:\new\file" जैसा Windows पाथ टूट जाता है या चुपचाप उसका मतलब बदल जाता है। स्ट्रिंग के अंदर असली लाइन ब्रेक भी अमान्य है।
{"path": "C:\new\file"} // अमान्य
{"path": "C:\\new\\file"} // मान्य
{"note": "line one\nline two"} // मान्य: लाइन ब्रेक एस्केप किया गया है
समाधान: हर असली बैकस्लैश को दोगुना करें और लाइन ब्रेक को \n के रूप में लिखें।
9. गायब या अतिरिक्त ब्रैकेट
Unexpected end of JSON input जैसे एरर का आमतौर पर मतलब है कि कोई क्लोज़िंग } या ] गायब है, या टेक्स्ट बीच में ही कट गया। एक अतिरिक्त ब्रैकेट आखिर के पास अनपेक्षित टोकन का एरर देता है।
समाधान: जो हिस्से पार्स होते हैं उन्हें ब्यूटीफ़ाई करें, या टेक्स्ट को हाथ से इंडेंट करें, और हर लेवल पर खुलने और बंद होने वाले ब्रैकेट गिनें। अगर इनपुट कट गया था (जैसे लंबाई की सीमा वाली कोई लॉग लाइन), तो आखिरी हिस्से का अंदाज़ा लगाने के बजाय पूरा मूल टेक्स्ट लें।
10. आपस में चिपके कई JSON दस्तावेज़
एक JSON दस्तावेज़ में ठीक एक टॉप-लेवल वैल्यू होती है। {"id":1}{"id":2} जैसे लगातार दो ऑब्जेक्ट एक दस्तावेज़ के रूप में मान्य नहीं हैं, और न ही ऐसी लॉग फ़ाइल जिसमें हर लाइन अपना अलग ऑब्जेक्ट हो।
समाधान: आइटम को एक ऐरे में रखें, [{"id":1},{"id":2}], या अगर फ़ाइल हर लाइन में अलग ऑब्जेक्ट के लिए बनी है तो उसे एक-एक लाइन करके पार्स करें।
एरर संदेशों को समझना
अलग-अलग भाषाएँ और ब्राउज़र एक ही समस्या को अलग शब्दों में बताते हैं। यहाँ उन संदेशों का मतलब है जो आपको सबसे ज़्यादा दिखेंगे।
Unexpected token < in JSON at position 0
पहला कैरेक्टर < है, यानी टेक्स्ट HTML है, JSON नहीं। सर्वर ने डेटा की जगह कोई एरर पेज, लॉगिन पेज या 404 पेज लौटाया है। पार्स करने से पहले HTTP स्टेटस कोड और Content-Type हेडर जाँचें। हमारा HTTP हेडर लुकअप किसी भी पब्लिक URL के लिए दोनों दिखाता है, और URL रीडायरेक्ट चेकर बताता है कि रिक्वेस्ट कहीं और, जैसे साइन-इन पेज पर, रीडायरेक्ट तो नहीं हो रही।
Unexpected token u in JSON at position 0
पार्सर को दी गई वैल्यू undefined थी, जो टेक्स्ट undefined बन जाती है। बग आपके कोड में पहले है: वेरिएबल कभी सेट ही नहीं हुआ।
Unexpected end of JSON input
स्ट्रक्चर पूरा होने से पहले ही पार्सर अंत तक पहुँच गया। कोई गायब ब्रैकेट या खाली रिस्पॉन्स बॉडी खोजें।
Expected property name or '}' / Expecting property name enclosed in double quotes
पहला संदेश JavaScript से और दूसरा Python के json मॉड्यूल से आता है। दोनों आमतौर पर आखिरी कॉमा, सिंगल कोट वाली की या बिना कोट की की की ओर इशारा करते हैं।
पोज़िशन 0 पर एक अदृश्य कैरेक्टर
अगर टेक्स्ट बिल्कुल सही दिखता है पर पहले ही कैरेक्टर पर फ़ेल होता है, तो हो सकता है वह बाइट ऑर्डर मार्क (BOM) या किसी दूसरे अदृश्य कैरेक्टर से शुरू हो रहा हो। फ़ाइल को बिना BOM के UTF-8 में सेव करें, या पार्स करने से पहले वह पहला कैरेक्टर हटा दें।
उदाहरण: टूटे हुए कॉन्फ़िग स्निपेट को ठीक करना
यह एक स्निपेट है जिसे किसी ने चैट मैसेज से पेस्ट किया था:
{
name: 'My App',
"debug": True,
// turn this off in production
"plugins": ["seo", "cache",],
"path": "C:\apps\myapp"
}
वैलिडेटर पहले एरर पर रुकता है, यानी लाइन 2 पर बिना कोट की की। एक-एक करके ठीक करते हैं:
- लाइन 2: की को कोट में रखें और डबल कोट इस्तेमाल करें, जिससे
"name": "My App"बनता है। - लाइन 3:
Trueकोtrueकरें। - लाइन 4: कमेंट हटाएँ।
- लाइन 5:
"cache"के बाद का कॉमा हटाएँ। - लाइन 6: बैकस्लैश दोगुने करें, जिससे
"C:\\apps\\myapp"बनता है।
मान्य नतीजा:
{
"name": "My App",
"debug": true,
"plugins": ["seo", "cache"],
"path": "C:\\apps\\myapp"
}
कमांड लाइन से JSON जाँचना
बड़ी फ़ाइलों या ऑटोमेटेड जाँच के लिए लोकल तौर पर वैलिडेट करें। अमान्य इनपुट पर इनमें से हर कमांड एरर के साथ खत्म होती है, इसलिए आप इन्हें स्क्रिप्ट में इस्तेमाल कर सकते हैं:
python3 -m json.tool data.jsonफ़ॉर्मेट किया JSON दिखाता है, या लाइन और कॉलम के साथ एरर।jq empty data.jsonफ़ाइल जाँचता है और मान्य होने पर कुछ नहीं दिखाता (jq इंस्टॉल होना चाहिए)।node -e "JSON.parse(require('fs').readFileSync('data.json','utf8'))"वही पार्सर इस्तेमाल करता है जो Node.js ऐप करते हैं।
इन गलतियों से बचें
- फ़ाइंड-एंड-रिप्लेस से सिर्फ़ लक्षण ठीक न करें। हर सिंगल कोट को आँख मूँदकर बदलने से टेक्स्ट के अंदर के एपॉस्ट्रॉफ़ी भी टूट जाते हैं। सिर्फ़ की और वैल्यू के आसपास के कोट ठीक करें।
- पार्स एरर को दबाएँ नहीं। जो कोड पार्सिंग फ़ेल होने पर खाली ऑब्जेक्ट लौटा देता है, वह असली बग छिपाता है। इसके बजाय एरर और इनपुट के शुरुआती कुछ कैरेक्टर लॉग करें (निजी डेटा लॉग किए बिना)।
- सिर्फ़ आउटपुट नहीं, सोर्स ठीक करें। अगर कोई सिस्टम बार-बार टूटा JSON बनाता है, तो स्ट्रिंग जोड़ने के बजाय उसे
JSON.stringify()याjson.dumps()जैसे सही सीरियलाइज़र से बनाएँ। - दूसरी एन्कोडिंग में छिपे डेटा पर ध्यान दें। URL या टोकन के अंदर का JSON अक्सर एन्कोड होकर आता है। पहले उसे URL डिकोडर या Base64 डिकोडर से डिकोड करें, फिर वैलिडेट करें।
संबंधित टूल और गाइड
- JSON वैलिडेटर और ब्यूटीफ़ायर सिंटैक्स जाँचता है और JSON को पढ़ने लायक फ़ॉर्मेट करता है।
- URL पार्सर किसी API पते को हिस्सों में बाँटता है ताकि आप पक्का कर सकें कि सही एंडपॉइंट कॉल हो रहा है।
- HTML एंटिटी कन्वर्टर
"जैसे टेक्स्ट को डिकोड करता है, जो कभी-कभी HTML में JSON डालने पर दिखता है। - DNS रिकॉर्ड कैसे जाँचें तब मदद करता है जब कोई API HTML लौटाता है क्योंकि डोमेन गलत सर्वर की ओर पॉइंट करता है।
- डुप्लिकेट कैसे हटाएँ और लिस्ट कैसे साफ़ करें JSON ऐरे में डालने से पहले वैल्यू को व्यवस्थित करने में काम आता है।
अक्सर पूछे जाने वाले सवाल
मेरा JSON सही दिखने पर भी अमान्य क्यों है?
आम संदिग्ध अदृश्य या मिलते-जुलते कैरेक्टर होते हैं: आखिरी कॉमा, सीधे कोट की जगह घुमावदार स्मार्ट कोट, फ़ाइल की शुरुआत में बाइट ऑर्डर मार्क, या कोई कमेंट। वैलिडेटर सटीक जगह बताता है ताकि आपको आँखों से खोजना न पड़े।
क्या JSON में आखिरी कॉमा की अनुमति है?
नहीं। मानक JSON किसी ऑब्जेक्ट या ऐरे के आखिरी आइटम के बाद कॉमा की अनुमति नहीं देता। JSONC और JSON5 जैसे ढीले फ़ॉर्मेट इसकी अनुमति देते हैं, लेकिन JSON.parse जैसे सख्त पार्सर इसे अस्वीकार करते हैं।
क्या JSON में कमेंट हो सकते हैं?
नहीं। मानक JSON में कमेंट का कोई सिंटैक्स नहीं है। पार्स करने से पहले कमेंट हटाएँ, या अगर फ़ाइल पढ़ने वाला प्रोग्राम अतिरिक्त की को नज़रअंदाज़ करता है तो _comment जैसे सामान्य फ़ील्ड का इस्तेमाल करें।
Unexpected token < in JSON at position 0 का क्या मतलब है?
टेक्स्ट लेस-दैन चिह्न से शुरू होता है, इसलिए यह लगभग निश्चित रूप से JSON की जगह कोई HTML पेज है, जैसे एरर पेज, लॉगिन पेज या 404 पेज। HTTP स्टेटस कोड, Content-Type हेडर और जिस URL की रिक्वेस्ट की थी, उसे जाँचें।
क्या JSON केस-सेंसिटिव है?
हाँ। लिटरल छोटे अक्षरों में true, false और null होने चाहिए, और की केस-सेंसिटिव होती हैं, इसलिए Name और name दो अलग की हैं।
JSON को वैलिडेट करने और ब्यूटीफ़ाई करने में क्या फ़र्क है?
वैलिडेट करना जाँचता है कि टेक्स्ट JSON के नियमों का पालन करता है या नहीं, और पहला एरर बताता है। ब्यूटीफ़ाई करना मान्य JSON में लाइन ब्रेक और इंडेंटेशन जोड़ता है ताकि लोग उसे आसानी से पढ़ सकें। इससे डेटा नहीं बदलता।