JSON parse त्रुटियाँ कैसे ठीक करें: Unexpected token की चरण-दर-चरण जाँच
मुख्य बात: JSON.parse त्रुटियों को पंक्ति और अक्षर में बदलें, फिर छह कारणों को बाहर करें: trailing comma, single quote, टिप्पणियाँ, नियंत्रण अक्षर, BOM और कटा हुआ इनपुट।

सार: parse त्रुटि आने पर बताई गई पंक्ति और स्तंभ पढ़कर पहला अवैध अक्षर खोजें, फिर तय करें कि यह गायब उद्धरण है, गायब comma, trailing comma, BOM या कटा हुआ इनपुट — पूरा दस्तावेज़ शुरू से दोबारा न पढ़ें।
त्रुटि संदेश कभी "क्या गलत है" नहीं बताता; वह केवल यह बताता है "parser कहाँ से आगे नहीं बढ़ सका"। ये दोनों स्थान अक्सर एक ही जगह नहीं होते।
1. पहले त्रुटि को निर्देशांक में बदलें
एक ही टूटा JSON अलग-अलग भाषाओं में बिल्कुल अलग त्रुटियाँ देता है, पर सभी को "कौन सी पंक्ति, कौन सा अक्षर" में बदला जा सकता है:
| वातावरण | सामान्य त्रुटि | इसे कैसे पढ़ें |
|---|---|---|
| Browser / Node | Unexpected token } in JSON at position 42 |
position 0-आधारित अक्षर offset है, पंक्ति संख्या नहीं |
| Node 20+ | Unexpected non-whitespace character after JSON at position 42 |
अर्थ है पहला भाग वैध है और अतिरिक्त सामग्री 42 के बाद शुरू होती है |
| Java Jackson | Unexpected character ('}' (code 125)): was expecting ... at [Source: (String)..."..." ; line: 3, column: 1] |
पंक्ति और स्तंभ सीधे देता है, सबसे उपयोगी |
| Python | json.decoder.JSONDecodeError: Expecting ',' delimiter: line 3 column 1 (char 42) |
char offset है; पंक्ति और स्तंभ मायने रखते हैं |
| Go | invalid character '}' looking for beginning of object key string |
केवल अक्षर देता है, इसलिए आपको पीछे जाकर उसे स्वयं खोजना होगा |
स्थान मिलने के बाद JSON को JSON ऑनलाइन parser में चिपकाएँ; टूल कर्सर त्रुटि स्थान पर रखता है और पंक्ति व स्तंभ संख्या हाइलाइट करता है — यह कदम अक्षरों को आँख से देखने का 90% काम बचा देता है।
2. छह बार-बार आने वाली त्रुटियाँ
1. Trailing comma
{
"name": "json",
"version": 1,
}
} से पहले एक अतिरिक्त comma है। JSON विनिर्देश trailing comma अनुमत नहीं करता, जबकि JavaScript object literal करते हैं, इसलिए कोड से कॉपी किया गया कॉन्फ़िगरेशन सबसे अधिक संभावना से इसे लिए होता है। समाधान: अंतिम comma हटाएँ; यदि यह डेटा पहले से किसी JS फ़ाइल में रहता है, तो उसे ज़बरदस्ती JSON में डालने के बजाय JSON5 रूपांतरण अपनाएँ।
2. Single quote और बिना उद्धरण key
{ 'name': 'json' }
{ name: "json" }
JSON स्ट्रिंग केवल दोहरे उद्धरण इस्तेमाल कर सकती हैं, और key भी दोहरे उद्धरण वाली स्ट्रिंग होनी चाहिए। ये दोनों JSON5 / JavaScript का ढीला व्याकरण हैं, JSON नहीं। स्ट्रिंग के भीतर दोहरा उद्धरण \" के रूप में और backslash \\ के रूप में लिखना होगा।
3. टिप्पणियाँ
{
// Timeout in milliseconds
"timeout": 3000
}
RFC 8259 के व्याकरण में टिप्पणियों के लिए कोई जगह नहीं है। या तो टिप्पणियाँ हटाएँ, या .jsonc / .json5 के रूप में सहेजें और टिप्पणियाँ समर्थित करने वाला parser इस्तेमाल करें। विभिन्न "टिप्पणी योजनाओं" के समझौतों के लिए देखें JSON में टिप्पणियाँ कैसे लिखें।
4. स्ट्रिंग के भीतर कच्चे newline और नियंत्रण अक्षर
{"sql": "SELECT *
FROM t"}
JSON स्ट्रिंग में कच्चा line feed, tab या U+0000–U+001F नियंत्रण अक्षर नहीं हो सकते; उन्हें \n, \t, \u0009 के रूप में लिखना होगा। बहु-पंक्ति पाठ JSON में भरते समय पहले संपादक में एक बार escape करें, या JSON minify और escape से एकरूपता से संभालें।
5. BOM हेडर
Windows Notepad द्वारा सहेजा गया UTF-8 तीन बाइट EF BB BF लिए होता है। BOM मिलते ही JSON.parse रिपोर्ट करता है Unexpected token, और आँख को यह दिखता ही नहीं। पहचानने का तरीका: फ़ाइल हेडर hex में देखें, या सामग्री ऑनलाइन टूल में कॉपी करके देखें कि पहला अक्षर जैसा दिखता है। समाधान: "UTF-8 without BOM" में सहेजें।
6. कटी हुई सामग्री
केवल पहले 4096 अक्षर छापने वाला लॉग, gateway द्वारा काटा गया API रिस्पॉन्स, बीच में रुका डाउनलोड — इस श्रेणी की पहचान है "त्रुटि अंत में है" और कोष्ठकों की गिनती मेल नहीं खाती। पहले कोष्ठक गिनें: यदि { और [ के बंद होने मेल नहीं खाते, तो यह कटाव है, सिंटैक्स त्रुटि नहीं। उस स्थिति में कुछ भी ठीक न करें — जाकर पूरा डेटा लाएँ।
3. चीनी पाठ और escaping से जुड़े दो झूठे अलार्म
चीनी \u4e2d\u6587 में बदल जाता है: यह वैध JSON escaping है, गड़बड़ पाठ नहीं। पार्स करने के बाद मान चीनी में बहाल हो जाता है; \u रूप केवल तब दिखता है जब आप कच्ची स्ट्रिंग सीधे देखते हैं। जब लोगों को दिखाना हो, तो बस प्रारूपण टूल से आउटपुट करें; escaping रणनीति की चिंता तभी करनी है जब चीनी को URL या लॉग में टिकना हो।
चीनी 涓枃 जैसा गड़बड़ पाठ बन जाता है: यह एन्कोडिंग समस्या है, JSON समस्या नहीं। यह तब होता है जब UTF-8 बाइट को GBK के रूप में डिकोड किया जाता है, जिससे "एक चीनी अक्षर के बदले तीन अक्षर" का यह नियमित पैटर्न बनता है। रिस्पॉन्स हेडर का Content-Type: application/json; charset=utf-8 जाँचें, और फ़ाइल पढ़ते समय encoding='utf-8' स्पष्ट रूप से दिया गया है या नहीं, यह भी जाँचें।
4. पाँच मिनट की मरम्मत कार्यप्रवाह
- टूल में चिपकाएँ: पहले ऑनलाइन parser से पहली त्रुटि खोजें, और एक बार में केवल एक ठीक करें;
- हर सुधार के बाद सत्यापित करें: हर बदलाव के बाद दोबारा पार्स करें, ताकि एक साथ कई जगहें ठीक करने पर नई त्रुटियाँ पुरानी को न ढक दें;
- एक बार minify करें: Minify से खाली जगह हटाएँ और दोबारा पार्स करें; इससे "संरचनात्मक त्रुटियाँ" और "खाली जगह या newline की समस्याएँ" अलग हो जाती हैं;
- संरचना की तुलना करें: यदि किसी बदलाव के बाद अचानक त्रुटि आए, तो पिछले संस्करण के मुकाबले JSON diff इस्तेमाल करें; अंतर आमतौर पर वही एक comma होता है;
- फ़ील्ड-स्तर सत्यापन: यदि व्याकरण पार हो जाए पर व्यवसाय परत अस्वीकार करे (गायब फ़ील्ड, गलत प्रकार), तो वह JSON Schema सत्यापन के अंतर्गत आता है, सिंटैक्स समस्या नहीं।
5. दो "एक जैसे दिखने वाले" JSON टुकड़ों में से एक पार्स होता है और दूसरा क्यों नहीं
सबसे आम कारण अदृश्य अक्षर हैं: पूर्ण-चौड़ाई comma ,, पूर्ण-चौड़ाई उद्धरण “”, non-breaking space U+00A0, zero-width space U+200B। स्क्रीन पर ये अपने आधी-चौड़ाई वाले रूपों से लगभग अलग नहीं पहचाने जाते, पर इनमें से कोई भी JSON व्याकरण का हिस्सा नहीं है।
पहचानने का केवल एक तरीका है: गड़बड़ करने वाले अक्षर के आसपास की सामग्री कॉपी करें और code point को बाइट-दर-बाइट जाँचें। ब्राउज़र console में निम्नलिखित चलाने पर हर वह अक्षर सूचीबद्ध होता है जो non-ASCII है और चीनी परास के बाहर है:
[...text].filter((ch) => {
const code = ch.codePointAt(0);
return code > 127 && !(code >= 0x4e00 && code <= 0x9fff);
});
यदि आउटपुट में 0x201c (बायाँ दोहरा उद्धरण), 0xff0c (पूर्ण-चौड़ाई comma) या 0x00a0 दिखे, तो वही दोषी है।
6. रोकथाम मरम्मत से सस्ती है
- commit से पहले कॉन्फ़िगरेशन फ़ाइलों पर parse जाँच चलाएँ; CI में एक पंक्ति काफ़ी है:
node -e "JSON.parse(require('fs').readFileSync('config.json','utf8'))"; - API रिस्पॉन्स serialization लाइब्रेरी से उत्पन्न करें; हाथ से स्ट्रिंग कभी न जोड़ें — हाथ से बनी स्ट्रिंग ही trailing comma और गायब उद्धरण का एकमात्र स्रोत है;
- JSON लॉग करते समय उसे टेम्पलेट में डालने के बजाय पहले
JSON.stringifyकॉल करें, ताकि आधा लिखा payload पूरा संदेश न समझा जाए।
अक्सर पूछे जाने वाले प्रश्न
JSON सिंटैक्स त्रुटि का स्थान जल्दी कैसे खोजूँ?
Parser जो position या पंक्ति/स्तंभ बताता है उसे लें; position 0-आधारित अक्षर offset है, पंक्ति संख्या नहीं, जबकि Java Jackson और Python सीधे पंक्ति और स्तंभ बताते हैं। JSON को JSON ऑनलाइन parser में चिपकाएँ और टूल कर्सर त्रुटि स्थान पर रखकर पंक्ति व स्तंभ हाइलाइट करता है। यदि त्रुटि शुरुआत में हो, तो फ़ाइल हेडर में BOM जाँचें और अदृश्य अक्षर खोजें।
कोड से कॉपी किए गए कॉन्फ़िगरेशन में trailing comma इतनी आसानी से क्यों आ जाता है?
JSON विनिर्देश trailing comma मना करता है जबकि JavaScript object literal उसे अनुमत करते हैं, इसलिए JS कोड से कॉपी किया गया कॉन्फ़िगरेशन आसानी से एक ले आता है। समाधान बस अंतिम comma हटाना है; यदि डेटा वैसे भी किसी JS फ़ाइल में ही रहना है, तो उसे ज़बरदस्ती JSON में डालने से JSON5 रूपांतरण बेहतर बैठता है।
टिप्पणियों वाली कॉन्फ़िगरेशन फ़ाइल को सामान्य JSON के रूप में पार्स कर सकता हूँ?
नहीं — RFC 8259 के व्याकरण में टिप्पणियों के लिए जगह नहीं है, इसलिए सीधे पार्स करने पर त्रुटि आती है। या तो टिप्पणियाँ हटाएँ, या .jsonc / .json5 के रूप में सहेजें और टिप्पणियाँ समर्थित करने वाला parser इस्तेमाल करें। टिप्पणी योजनाओं के समझौतों के लिए देखें JSON में टिप्पणियाँ कैसे लिखें।