JSON Toolkit

JSON এরর মেসেজ লুকআপ: এরর টেক্সট থেকে সরাসরি সমাধানে

সংক্ষেপে: ঠিক JSON.parse মেসেজ দেখে কারণ খুঁজুন: Chrome, Firefox ও Safari-তে ১২টি ঘন ঘন এরর, সঙ্গে HTML এরর পেজ, কাটা-পড়া ও ডাবল পার্সিং।

উন্নত~8 মিনিট পড়াপ্রকাশ 2026-10-30আপডেট 2026-11-04
JSON এরর মেসেজ লুকআপ টেবিলের কভার

মূল কথা: JSON.parse এরর এলে আগে position ও token নিন; position 0 মানে HTML রেসপন্স, BOM বা ভুল টাইপ খুঁজুন, আর "Expected" মেসেজ মানে আগের অক্ষরটি দেখুন — দেখানো position থেকে লাইন ধরে আবার পড়বেন না।

এরর টেক্সট শুধু শব্দ নয় — এটাই উত্তর। পার্সার বলে দেয় কোন অক্ষরে ধাক্কা লেগেছে, কী প্রত্যাশা করেছিল, আর আসলে কী পেয়েছে। এরর মেসেজ দিয়ে খোঁজা পুরো ডকুমেন্ট হাতে আবার লেখার চেয়ে ভালো।

প্রতিটি JSON.parse() এররের তিনটি অংশ থাকে: position (অক্ষর অফসেট, বা line/column), প্রত্যাশা (Expected...), আর বাস্তবতা (Unexpected token X, বা xxx is not valid JSON)। ইঞ্জিনভেদে ভাষা আলাদা — Chrome ও Node (V8) বলে Expected ',' or '}' after property value in JSON at position 25, Firefox বলে JSON.parse: expected ',' or '}' after property value in object at line 3 column 1, Safari বলে JSON Parse error: Expected ',' or '}' — কিন্তু তিনটিই একই সিনট্যাক্স ভাঙার দিকে ইশারা করে। এরর খোঁজার সময় শব্দভাণ্ডার বাদ দিয়ে তিনটি তথ্য নিন: কোন অক্ষর, কী প্রত্যাশিত, কী এসেছে।

১. ১২-এরর লুকআপ টেবিল

বাঁ কলাম হলো আপনার কনসোল থেকে সবচেয়ে সহজে চেনা যায় এমন টুকরো (V8-এর ভাষা)। Firefox/Safari-এর রূপ বন্ধনীতে।

এরর টেক্সট (V8) আসল কারণ সমাধান
Unexpected token < in JSON at position 0 API JSON নয়, HTML ফেরত দিয়েছে (404 পেজ, 500 টেমপ্লেট, লগইন রিডাইরেক্ট, প্রক্সি ফ্যালব্যাক) আগে response.status ও Content-Type দেখুন; JSON ঠিক করবেন না
Unexpected end of JSON input ইনপুট খালি বা কাটা: খালি বডি, 204, বিঘ্নিত ডাউনলোড, কপিতে শেষ লাইন নেই খালি কেস হ্যান্ডল করুন, কাটা খুঁজতে Content-Length মিলিয়ে দেখুন
Unexpected token o / "[object Object]" is not valid JSON ইতিমধ্যে পার্স করা অবজেক্ট আবার JSON.parse()-এ দেওয়া হয়েছে এবং স্ট্রিংয়ে রূপান্তরিত typeof দেখুন; অবজেক্ট হলে সরাসরি ব্যবহার করুন
"undefined" is not valid JSON ভেরিয়েবলে কখনো মান দেওয়া হয়নি (JSON.parse(undefined)) ফলব্যাক মান ইনিশিয়ালাইজ করুন; পার্সের আগে গার্ড করুন
Expected double-quoted property name in JSON ট্রেইলিং কমা ({"a": 1,}); পার্সার আরেকটি কি প্রত্যাশা করে } পায় শেষ উপাদানের পরে কমা মুছুন
Expected property name or '}' in JSON আনকোয়োটেড বা সিঙ্গেল-কোটেড কি ({name: "Ada"}, {'name': 'Ada'}) প্রতিটি কি ডাবল কোট করুন
Expected ',' or '}' after property value in JSON বাদ পড়া কমা ({"a": 1 "b": 2}) বা ভ্যালুর পরে কমেন্ট কমা যোগ করুন; কমেন্ট সরান
Unexpected token '/' JSON-এর ভেতরে // বা /* */ কমেন্ট সরান, বা কনফিগ JSONC হিসেবে পার্স করুন
Bad control character in string literal স্ট্রিংয়ের ভেতরে কাঁচা নিউলাইন, ট্যাব বা U+0000–U+001F কন্ট্রোল ক্যারেক্টার \n লিখুন; JSON.stringify দিয়ে জেনারেট করুন
Unterminated string in JSON " দিয়ে খোলা স্ট্রিং কখনো বন্ধ হয়নি, বা ভেতরের কোট এস্কেপ হয়নি ভেতরের কোট \" হিসেবে এস্কেপ করুন
Unexpected non-whitespace character after JSON এক টেক্সটে দুই ডকুমেন্ট: {}{}, NDJSON, JSONP র‍্যাপার লাইন ধরে ভাগ করে প্রতিটি পার্স করুন, বা NDJSON পার্সার ব্যবহার করুন
JSON.parse is not a function আপনার নিজের ভেরিয়েবল গ্লোবাল JSON-কে ছায়া করেছে ভেরিয়েবলের নাম বদলান; কখনো JSON নাম দেবেন না

প্রথম দুটি একটু ভালোভাবে দেখতে হয়, কারণ কোনোটিই "আপনার JSON ভুল" বোঝায় না — বোঝায় "আপনি যা পেয়েছেন তা আপনি যা ভাবছেন তা নয়"।

২. position-0 এররের তিনটি সাধারণ উৎস

position 0 মানে একেবারে প্রথম অক্ষরটিই অবৈধ। কিছু সন্দেহজনক না দেখালে অক্ষরটি সম্ভবত অদৃশ্য। তিনটি সাধারণ সন্দেহভাজন:

প্রথম: <, অর্থাৎ HTML। প্রোডাকশনে এটাই সবচেয়ে সাধারণ পার্স এরর। ভুল URL, গেটওয়ের রিডাইরেক্ট করা মেয়াদোত্তীর্ণ সেশন, বা সার্ভার এরর টেমপ্লেট — বডি শুরু হয় <!DOCTYPE html> দিয়ে আর পার্সার প্রথম অক্ষরেই থেমে যায়। সঠিক কাজ হলো Network প্যানেল খুলে কাঁচা রেসপন্স পড়া, তারপর API কল ঠিক করা, JSON নয়।

দ্বিতীয়: BOM বা জিরো-উইডথ অক্ষর। Windows নোটপ্যাডে সেভ করা ফাইল প্রায়ই UTF-8 BOM (\uFEFF) দিয়ে শুরু হয়, আর ওয়েব পেজ বা চ্যাট অ্যাপ থেকে কপি করা টেক্সটে জিরো-উইডথ স্পেস (\u200B–\u200D) থাকতে পারে। আপনার কাছে অদৃশ্য, পার্সারের কাছে স্পষ্ট:

// পার্সের আগে BOM ও জিরো-উইডথ অক্ষর সরান
const cleaned = raw.replace(/^\uFEFF/, '').replace(/[\u200B-\u200D]/g, '');
const data = JSON.parse(cleaned);

তৃতীয়: ভুল টাইপ। JSON.parse(undefined) রিপোর্ট করে "undefined" is not valid JSON; JSON.parse(someObject) রিপোর্ট করে Unexpected token o (অবজেক্টটি "[object Object]"-এ রূপান্তরিত হয়েছে, আর o position 1-এ অবৈধ)। দুটোই বোঝায় "ডেটা ইতিমধ্যে পার্স করা" বা "কখনো কোনো ডেটা ছিল না"। সিনট্যাক্স নয়, টাইপ দেখুন:

let data = text;
if (typeof data === 'string') {
  data = JSON.parse(data); // কেবল সত্যিই স্ট্রিং হলে পার্স করুন
}

৩. position নিচের দিকে ইশারা করে; কারণ উপরে

দুটি এরর লোকেশন সম্পর্কে বিভ্রান্ত করে, আর এগুলোই টেবিলের সবচেয়ে ভুল-পঠিত এন্ট্রি:

  • বাদ পড়া কমা: {"a": 1 "b": 2} রিপোর্ট করে Expected ',' or '}' after property value "b" লাইনে। রিপোর্ট ঠিক, কিন্তু সমাধান আগের লাইনের শেষে।
  • বাদ পড়া ক্লোজিং ব্র্যাকেট: গভীর নেস্টিংয়ে একটি } বা ] বাদ গেলে পার্সার ইনপুটের শেষ পর্যন্ত সব গিলে ফেলে এবং Unexpected end of JSON input রিপোর্ট করে। position ফাইলের শেষ; আসল ফাঁক অনেক আগে হতে পারে। সবচেয়ে সাম্প্রতিক অ-বন্ধ { বা [-এর জন্য পিছনে খুঁজুন — জোড়া গণনা চোখে দেখার চেয়ে ভালো।

সাধারণ কৌশল হলো দ্বিখণ্ডন: দেখানো position-এর আগের টেক্সট কেটে একা পার্স করুন। পার্স হলে সমস্যা দেখানো position-এর কাছেই; না হলে আরও পিছনে দ্বিখণ্ডন করুন। প্রথম ব্যর্থ টুকরোর সীমানাই আসল এরর জায়গা। বড় ফাইলে আগে ডকুমেন্ট ফরম্যাট করুন — ইনডেন্টেশন মিলে গেলে বাদ পড়া স্তর এক নজরে দেখা যায় (অনলাইন JSON ফরম্যাটার এ কাজে ভালো)।

৪. পার্স ঠিক অথচ আচরণ ভুল — চারটি "মিথ্যা-সুস্থ" অবস্থা

এররের চেয়ে খারাপ হলো এরর নেই কিন্তু ডেটা ভুল। চারটি ক্ষেত্রেই JSON বৈধ আর পার্সার খুশি — সমস্যা ডেটার আকৃতিতে:

  1. ডাবল এনকোডিং: পুরো ডকুমেন্ট দুইবার JSON.stringify হয়েছে, তাই পার্সে স্ট্রিং পাওয়া যায়, অবজেক্ট নয়। typeof result === 'string' হলে আবার পার্স করুন — তবে উৎসে গিয়ে দ্বৈত সিরিয়ালাইজেশন খুঁজে ঠিক করুন।
  2. ডুপ্লিকেট কি নীরবে ওভাররাইট: {"name": "Tom", "name": "Jerry"} বৈধ JSON, বেশিরভাগ পার্সার অভিযোগ করে না, আর দ্বিতীয় মান জিতে যায়। একাধিক উৎসের ডেটা মার্জ করার সময় এটি কামড়ায়; কামড়ানোর আগে কঠোর JSON ভ্যালিডেটর দিয়ে এটি সামনে আনুন।
  3. NDJSON-কে এক ডকুমেন্ট ভাবা: স্ট্রিমিং API প্রতি লাইনে একটি অবজেক্ট দেয়; পুরো টেক্সট পার্স করলে Unexpected non-whitespace character after JSON দিয়ে ব্যর্থ হয়। \n দিয়ে ভাগ করে লাইন ধরে পার্স করুন।
  4. নীরব সংখ্যা-নির্ভুলতা ক্ষতি: 2^53 - 1-এর বেশি ইন্টিজার (স্নোফ্লেক ID) শেষ অঙ্ক শূন্য হয়ে ফিরে আসে, কোনো এরর ছাড়াই। ID স্ট্রিং হিসেবে পাঠান।

সাধারণ সূত্র: পার্সার মনে করে সব ঠিক আছে। তাই API ডেটা ভুল মনে হলে আগে কাঁচা টেক্সটের প্রথম ৮০ অক্ষর ও তার typeof ছাপুন — বিষয়বস্তু নিয়ে আলোচনার আগে আকৃতি নিশ্চিত করুন।

৫. লেখার সময়ই এরর অসম্ভব করুন

লুকআপ টেবিল ঘটনার পরেের টুল; প্রতিরোধ ঘটনার আগের টুল। চারটি অভ্যাস বেশিরভাগ এরর ঘটার আগেই আটকে দেয়:

// ১. যেকোনো রেসপন্স পার্সের আগে দুইটি চেক
const response = await fetch('/api/users');
if (!response.ok) {
  throw new Error(`HTTP ${response.status}: the API returned no data`);
}
const contentType = response.headers.get('content-type') ?? '';
if (!contentType.includes('application/json')) {
  throw new Error(`Expected JSON, got ${contentType}`);
}
const data = await response.json(); // ২. json() ইতিমধ্যে পার্স করে — আবার পার্স করবেন না
  • জেনারেট করতে সিরিয়ালাইজ করুন, কখনো জোড়া লাগাবেন না: JSON.stringify() কোট, নিউলাইন ও কন্ট্রোল ক্যারেক্টার ঠিকভাবে হ্যান্ডল করে; হাতে বানানো স্ট্রিংই Bad control character ও Unterminated string-এর প্রধান উৎস।
  • সবসময় catch করুন: JSON.parse এরর কেউ catch না করলে সিঙ্ক্রোনাস ক্র্যাশ। অবিশ্বস্ত ইনপুট — localStorage, বাইরের ফাইল — এর ক্ষেত্রে catch ব্লকে ডিফল্ট মান বা স্পষ্ট এরর রিপোর্টিং দরকার।
  • কাঠামো Schema-কে দিন: বৈধ সিনট্যাক্স মানে বৈধ কাঠামো নয়। বাদ পড়া ফিল্ড ও ভুল টাইপ সীমানায় JSON Schema ভ্যালিডেশনের কাজ; দেখুন JSON Schema কী সমাধান করে।

৬. দ্রুত সিদ্ধান্তের পথ

পুরো নিবন্ধকে এক সিদ্ধান্ত-ক্রমে সংকুচিত করুন। এরর দেখলে আগে position ও token নিন:

  1. Position 0 → তিনটি উৎস দেখুন: < (HTML), BOM, ভুল টাইপ;
  2. end of input → খালি বা কাটা বডি দেখুন, তারপর পিছনে খুঁজে অ-বন্ধ ব্র্যাকেট খুঁজুন;
  3. Expected ... → আগের অক্ষরটি দেখুন; সাধারণত বাদ পড়া কমা বা কোট;
  4. after JSON data → একাধিক ডকুমেন্ট জোড়া লেগেছে; লাইন ধরে ভাগ করুন;
  5. পার্স ঠিক কিন্তু ডেটা ভুল → চারটি "মিথ্যা-সুস্থ" চেক চালান।

JSON পার্স এরর ঠিক করার উপায়-এর ধাপে ধাপে ট্রায়াজের সঙ্গে মিলিয়ে ৯০% পার্স সমস্যা পাঁচ মিনিটে সমাধান হয়। এরর টেক্সটটি নিজেই বুকমার্ক করে রাখুন — এটি পার্সারের আপনার জন্য লেখা ডিবাগিং লগ, এর ভাষা প্রতি তিন বছরে একবার বদলায়, আর একবার লুকআপ করলে এক বছরের কাজ বাঁচে।

"Unexpected token in JSON" মানে কী?

পার্সার এমন একটি অক্ষরে ধাক্কা খেয়েছে যা JSON ব্যাকরণে ওই জায়গায় অবৈধ। token হলো প্রত্যাখ্যাত অক্ষর: < সাধারণত বোঝায় API HTML দিয়েছে, ' বোঝায় সিঙ্গেল কোট, / বোঝায় কমেন্ট, আর সাধারণ অক্ষর সাধারণত বোঝায় আনকোয়োটেড কি বা undefined/NaN-এর মতো কেবল-JavaScript লিটেরাল। আগে token পড়ুন, তারপর position, আর কারণ একটি জায়গায় সংকুচিত হয়।

"Unexpected end of JSON input" কীভাবে ঠিক করব?

দুটি উৎস: খালি ইনপুট (খালি রেসপন্স বডি, বা localStorage-এ খালি স্ট্রিং) বা কাটা ইনপুট (বিঘ্নিত ডাউনলোড, শেষ লাইন ছাড়া কপি, আকারের সীমা)। খালি কেস if (!text) return দিয়ে হ্যান্ডল করুন; তারপর সম্পূর্ণতা যাচাই করে সবচেয়ে সাম্প্রতিক অ-বন্ধ {, [ বা " বন্ধ করুন। খেয়াল করুন, গভীরে বাদ পড়া ব্র্যাকেট থেকেও এরর আসতে পারে — position শুধু ফাইলের শেষে পড়েছে।

Chrome, Firefox আর Safari কেন ভিন্নভাবে এরর দেয়?

তিনটি ব্রাউজার ভিন্ন JS ইঞ্জিন (V8, SpiderMonkey, JavaScriptCore) বহন করে, আর প্রতিটি নিজের ভাষায় এরর লেখে; MDN সব সরকারি রূপ নথিভুক্ত করে। তবে তিনটিতেই একই তিনটি উপাদান — position, প্রত্যাশা, বাস্তবতা — এক-এক সেমান্টিক্সে থাকে। V8-এর ভাষায় অনুবাদ করে এই টেবিলটি যেমন আছে তেমন ব্যবহার করুন।

এরর position এমন জায়গায় দেখাচ্ছে যেখানে সব ঠিক — এখন কী?

আসল এরর আগে। সাধারণ কেস: বাদ পড়া কমা (পরের লাইনে রিপোর্ট), বাদ পড়া ক্লোজিং ব্র্যাকেট (ফাইলের শেষে রিপোর্ট)। দেখানো position থেকে টোকেন ধরে পিছনে হাঁটুন, বা দ্বিখণ্ডন করুন: প্রথম অর্ধেক একা পার্স করুন, প্রথম ব্যর্থ টুকরোর সীমানাই আসল এরর জায়গা।