JSON-এর ভুল ধরা: ত্রুটির বার্তা পড়ার নিয়ম ও সাধারণ ভুল

শেষে বাড়তি কমাওয়ালা JSON আর তার ত্রুটির বার্তা, যাতে position 7 লেখা

রাত এগারোটায় একটি কনফিগ ফাইল আর চলছে না। ফাইলটি JSON, আর কাল্পনিক ডেভেলপার তানিয়া সন্দেহ করছে কোথাও একটি কমা বাদ পড়েছে। ২০০ লাইনের ফাইলে সেটা খোঁজা সময়সাপেক্ষ, তবে JSON ফরম্যাটার টুলে লেখাটি বসিয়ে “যাচাই করুন” চাপলে ব্রাউজার নিজেই বলে দেয় সে কোথায় আটকেছে। সমস্যা একটাই: বার্তাটি ইংরেজিতে, আর তা পড়ার নিয়ম না জানলে বার্তা কাজে লাগে না। এই লেখায় সেই নিয়ম আর বারোটি সাধারণ ভুল। টুলের তিন বোতাম কী করে, তা আগের গাইডে আছে।

বার্তা কীভাবে পড়বেন

এক লাইনের JSON-এ অক্ষরের ক্রম ০ থেকে ৭ আর তিন লাইনের JSON-এ কমা বাদ পড়া লাইনের পরের লাইনে ত্রুটি দেখানো
position গোনা শুরু ০ থেকে, line আর column ১ থেকে।

ভুল পেলে টুল “JSON-এ ভুল আছে:” লিখে তার পরে ব্রাউজারের নিজের বার্তাটি বসিয়ে দেয়। যেমন লেখাটি {"a":1,} হলে বার্তা আসে:

Expected double-quoted property name in JSON at position 7 (line 1 column 8)

অর্থ: “এখানে দ্বৈত উদ্ধৃতিচিহ্নে ঘেরা একটি কী-এর নাম আশা করেছিলাম।” তিনটি সংখ্যা জায়গা বলে দেয়:

  • position: কত নম্বর অক্ষরে এসে থেমেছে। গোনা শুরু ০ থেকে। এখানে ০ হলো {, ১ হলো “, ২ হলো a, … আর ৭ হলো শেষের }। অর্থাৎ ৮ম অক্ষর।
  • line: কত নম্বর লাইন, গোনা শুরু ১ থেকে।
  • column: ওই লাইনের কত নম্বর অক্ষর, এটিও ১ থেকে। তাই position ৭ আর column ৮ একই জায়গা।

এখানে একটি ফাঁদ আছে। ব্রাউজার যেখানে আটকেছে সেই জায়গা বলে, যেখানে ভুল হয়েছে সেটা নয়, আর দুটি সবসময় এক নয়। তিন লাইনের এই লেখাটি দেখুন:

{
  "a": 1
  "b": 2
}

বার্তা আসে Expected ',' or '}' after property value in JSON at position 13 (line 3 column 3)। ব্রাউজার ৩ নম্বর লাইনের “b”-তে এসে বুঝেছে কিছু গড়বড়। কিন্তু আসল ভুল ২ নম্বর লাইনের শেষে, যেখানে “a”: 1-এর পরে কমা লাগত। তাই নিয়ম: বার্তার জায়গার একটু আগেও দেখুন, বিশেষ করে আগের লাইনের শেষ।

আরেকটি জিনিস: পার্সার প্রথম ভুলেই থামে। একটি ঠিক করে আবার চালালে পরের ভুলের বার্তা আসে। যেমন {'a':1,}-এ প্রথমে একক উদ্ধৃতিচিহ্ন ধরা পড়ে (position 1)। সেটি ঠিক করলে তবেই শেষের কমার বার্তা (position 7) আসে। তাই একটি ভুল ঠিক করেই আবার চাপুন, আশা করবেন না এক চাপে সব বেরোবে।

একটি সতর্কতা: বার্তার শব্দ ও ভাষা ব্রাউজার ও তার সংস্করণ ভেদে আলাদা। এই লেখার সব বার্তা আমি Node 22-এ (যার JavaScript ইঞ্জিন V8, Chrome-এর একই) চালিয়ে নিয়েছি। পুরোনো Chrome বা Firefox ও Safari-র বার্তা অন্যরকম হতে পারে, আমি সেগুলোয় পরীক্ষা করিনি। তবে তিনটি তথ্যই (জায়গা, কী আশা করেছিল, কী পেল) সাধারণত থাকে।

বারোটি সাধারণ ভুল

আটটি সাধারণ JSON ভুল ও তাদের ঠিক রূপের ছক, সঙ্গে কারণ
আটটি ভুল, ঠিক রূপ ও কারণ।

নিচের প্রতিটির বার্তা আসল পার্সারে চালিয়ে পাওয়া। (উদাহরণের লেখা সব কাল্পনিক।)

  1. শেষ উপাদানের পরে কমা। {"a":1,} → Expected double-quoted property name ... position 7। তালিকায় [1,2,] দিলে বার্তা হয় Unexpected token ']'। ঠিক রূপ: শেষের কমা তুলে দিন।
  2. একক উদ্ধৃতিচিহ্ন। {'a':'x'} → Expected property name or '}' in JSON at position 1। JSON-এ শুধু দ্বৈত উদ্ধৃতিচিহ্ন (“) চলে।
  3. কী-তে উদ্ধৃতিচিহ্ন নেই। {a:1} → ঠিক একই বার্তা, position 1। JavaScript-এ এটি চলে, JSON-এ নয়।
  4. কমা বাদ। {"a":1 "b":2} → Expected ',' or '}' after property value ... position 7। ওপরের তিন লাইনের উদাহরণ এরই বড় রূপ।
  5. কোলন বাদ। {"a" 1} → Expected ':' after property name ... position 5।
  6. বন্ধনী মেলেনি। {"a":[1,2} → Expected ',' or ']' after array element ... position 9। তালিকা ] দিয়ে বন্ধ হয়নি। সাজানো রূপে বন্ধনীর ইন্ডেন্ট দেখলে সহজে ধরা যায়।
  7. মন্তব্য। {"a":1 // নোট আর পরের লাইনে } → Expected ',' or '}' ... position 7। // বা /* */ JSON-এ নেই। কিছু কনফিগ ফরম্যাটে মন্তব্য চলে (সাধারণ জ্ঞান), কিন্তু সেটি সাধারণ JSON নয়, আর এই টুলও মানে না।
  8. undefined বা NaN। {"a":undefined} → Unexpected token 'u'। JSON-এ “মান নেই” বোঝাতে null লিখতে হয়।
  9. লেখার ভেতরে সরাসরি নতুন লাইন বা ট্যাব। একটি লেখার মান দুই লাইনে ভাঙলে Bad control character in string literal in JSON at position 7। নতুন লাইনের জায়গায় \n লিখতে হয়।
  10. শূন্য দিয়ে শুরু সংখ্যা। {"a":007} → Unexpected number in JSON at position 6। +5 বা 0x10 লিখলেও সংখ্যাটি সঠিক JSON নয়। ফোন নম্বর বা কোডের মতো শূন্য দিয়ে শুরু মান লেখা হিসেবে (“007”) রাখুন।
  11. বাঁকা উদ্ধৃতিচিহ্ন। Word বা চ্যাট থেকে কপি করলে ” হয়ে যায় “ ”। {“a”:1} → Expected property name or '}' ... position 1। চোখে প্রায় একই দেখায় বলে ধরা কঠিন। সোজা উদ্ধৃতিচিহ্ন বসান।
  12. দুটি JSON জোড়া লেগেছে। {"a":1}{"b":2} (বা দুই লাইনে দুটি) → Unexpected non-whitespace character after JSON at position 7। এক বক্সে একটি মানই চলে। লগ ফাইলে প্রতি লাইনে একটি করে JSON থাকলে সেগুলো [ ] -এর ভেতরে কমা দিয়ে বসান বা এক এক করে সাজান।

তেরো নম্বর হিসেবে একটি অদৃশ্য ভুলও আছে: ফাইলের শুরুতে লুকানো একটি চিহ্ন (BOM) থাকলে বার্তা আসে Unexpected token '', আর উদ্ধৃতিচিহ্নের ভেতরটা খালি দেখায়। কিছু প্রোগ্রাম থেকে ফাইল সেভ করলে এমন হয়। বক্সের প্রথম অক্ষর মুছে লেখাটি ঠিক করুন। আমি এটি পার্সারে চালিয়ে দেখেছি, কিন্তু টুলের বক্সে বসালে ব্রাউজার চিহ্নটি রাখে কি না যাচাই করিনি।

ভুল নেই, তবু সাজালে যা বদলে যায়

ঠিক JSON-ও সাজালে বদলাতে পারে এমন চারটি জিনিস: সংখ্যার শূন্য, বড় পূর্ণসংখ্যা, একই কী দুইবার ও সংখ্যার মতো কী
আগে ও পরের রূপ, ব্রাউজারের JSON.parse ও JSON.stringify অনুযায়ী।

এবার উল্টো দিক। টুল লেখাটি পড়ে (JSON.parse) আবার লেখে (JSON.stringify), তাই ফল সবসময় হুবহু মূল লেখা নয়। চারটি বদল আমার চোখে পড়েছে:

  • সংখ্যার লেখা ছোট হয়: 1.50 হয় 1.5, 1e3 হয় 1000, -0 হয় 0। মান একই থাকে।
  • খুব বড় পূর্ণসংখ্যা গোল হয়ে যায়: 12345678901234567890 হয়ে যায় 12345678901234567000, আর 9007199254740993 হয় 9007199254740992। কারণ ব্রাউজার সব সংখ্যা ভাসমান বিন্দুর (double) রূপে রাখে, যেখানে ৯০০৭১৯৯২৫৪৭৪০৯৯১ (প্রায় ৯ কোয়াড্রিলিয়ন)-এর ওপরের পূর্ণসংখ্যা নির্ভুল থাকে না। একই JSON-এ যে আইডিটি উদ্ধৃতিচিহ্নে লেখা (“1234567890123456789”), সেটি হুবহু থাকে। তাই এত বড় আইডি লেখা হিসেবে রাখাই নিরাপদ।
  • একই কী দুইবার থাকলে শেষেরটি থাকে: "dup":1, "dup":2 হয়ে যায় "dup": 2, আর আগেরটি নিঃশব্দে হারায়, কোনো সতর্কবার্তা আসে না।
  • সংখ্যার মতো কী আগে আসে: "b", "10", "2" ক্রমে লেখা কী সাজানোর পর হয় "2", "10", "b"।

আরও দুটি ছোট জিনিস: লেখার ভেতরের \u00e9 ফলাফলে সোজা é হয়ে যায়, আর \/ হয় /। বাংলা লেখা যেমন ছিল তেমন থাকে। নীতিকথা: টুলের ফল দিয়ে মূল ফাইলটি নিঃশব্দে বদলে ফেলবেন না। বিশেষ করে বড় আইডি বা একই কী দুইবার থাকার সম্ভাবনা থাকলে মূল ফাইলের একটি কপি রাখুন, আর দুই রূপ মিলিয়ে নিন।

ভুল খোঁজার পাঁচ ধাপ

  1. “সাজান” চাপুন। ভুল থাকলে বার্তা আসবে, আর সাজালে ভুল নেই এমন অংশ আলাদা লাইনে সুন্দর দেখাবে।
  2. বার্তার position ও line দেখুন, আর ওই জায়গার আগের লাইনের শেষটাও দেখুন।
  3. বার্তার প্রথম অংশ (Expected …) থেকে ধরুন কী চাইছিল: নাম, কমা, কোলন, বন্ধনী?
  4. একটি ভুল ঠিক করে আবার চাপুন। নতুন বার্তা এলে সেটি পরের ভুল।
  5. “JSON সঠিক আছে।” এলে থামুন। তবে মনে রাখুন, এর মানে শুধু গড়ন ঠিক। কোনো কী-এর নাম বানান ভুল কি না, qty সংখ্যা কি না, তা এই যাচাই দেখে না।

সীমাবদ্ধতা ও হালনাগাদ: সব বার্তা ও বদলের উদাহরণ Node 22-এর পার্সার ও স্ট্রিংগিফায়ারে চালিয়ে পাওয়া। আসল ব্রাউজারে টুল খুলে প্রতিটি লেখা বসিয়ে দেখিনি, আর Firefox ও Safari-র বার্তা জানি না। পুরোনো ব্রাউজারে ভাষা আলাদা হতে পারে। টুলটি একটি ভুলই দেখায় আর ঠিক করে দেয় না। কমা-বাদ-পড়া ফাইলের উদাহরণ ও সব নাম কাল্পনিক। হালনাগাদ: ২৬ অক্টোবর ২০২৬।

সাধারণ প্রশ্ন

বার্তা ইংরেজিতে কেন?

বার্তাটি ব্রাউজারের নিজের, টুল শুধু “JSON-এ ভুল আছে:” অংশটুকু বাংলায় বসায়। তাই ব্রাউজার বদলালে বার্তার শব্দও বদলাতে পারে।

কমা কোথায় বসবে, বার্তা সরাসরি বলে না কেন?

পার্সার শুধু জানে কোথায় এসে তার আশা মেলেনি। আসল ভুল কোথায় তা সে জানে না, তাই ওপরের নিয়মে একটু আগে থেকে খুঁজতে হয়।

বক্স ফাঁকা রেখে বোতাম চাপলে কী হয়?

টুল “আগে JSON লেখা বসান।” বার্তা দেয়। ব্রাউজারের কোনো ভুলের বার্তা আসে না।

এক চাপে সব ভুল দেখা যায়?

না। পার্সার প্রথম ভুলেই থামে। একটি ঠিক করে আবার চালাতে হয়।

লেখা কোথাও যায়?

টুলের নিজের প্রশ্নোত্তর অনুযায়ী সবকিছু ব্রাউজারেই চলে। আর কোন ধরনের তথ্য বসাবেন, তা নিয়ে আগের গাইডে একটি সতর্কতা আছে।