মূল বিষয়বস্তুতে যান
CuteJSON
↑↓ নেভিগেট Enter নির্বাচন Esc বন্ধ

সাধারণ JSON সিনট্যাক্স ত্রুটি এবং সেগুলো কিভাবে ঠিক করবেন

প্রকাশিত 4 মিনিট পড়ুন Akash Kinkar Pandey দ্বারা

প্রায় প্রতিটি JSON ত্রুটি যা আপনি দেখবেন তা নয়টি বিষয়ের একটি। পার্সারের বার্তা কোনটি তা বিরলভাবে বলে, কারণ বেশিরভাগ পার্সার ত্রুটির পরিবর্তে যে টোকেনে তারা আটকেছে তা রিপোর্ট করে, এবং এগুলো এক নয়। নিচে প্রতিটি ত্রুটি, আপনি যে বার্তা দেখতে পাবেন, এবং সেটি ঠিক করার সম্পাদনা দেওয়া হলো।

যদি সাথে চলতে চান, এদের যেকোনোটি JSON ভ্যালিডেটরে পেস্ট করুন। এটি ত্রুটির নাম বলে এবং লাইন চিহ্নিত করে।

1. একটি ট্রেইলিং কমা

{
  "name": "ana",
  "role": "admin",
}

শেষ বৈশিষ্ট্যের পরের কমা JavaScript-এ বৈধ এবং JSON-এ অবৈধ। বেশিরভাগ পার্সার এটি ক্লোজিং ব্রেসে রিপোর্ট করে, আসল কমার নিচে এক লাইন নিচে, তাই মানুষ ব্রেসটি ঘুরিয়ে দেখে এবং কিছু ভুল দেখে না।

কমাটি মুছে ফেলুন। যদি আপনি কনফিগারেশন ফাইল হাতে সম্পাদনা করার কারণে এই সমস্যা বারবার পান, তাহলে JSON মেরামত টুল সেগুলো সরিয়ে দেয় এবং প্রতিটি সরানো কমা দেখায়।

2. সিঙ্গেল কোটস

{ 'name': 'ana' }

JSON-এ স্ট্রিংয়ের জন্য একটি মাত্র সিনট্যাক্স আছে এবং এটি ডাবল কোটস ব্যবহার করে। সিঙ্গেল কোটস একটি JavaScript অভ্যাস। সমাধান যান্ত্রিক, এবং দস্তাবেজ বড় হলে হাতে করার চেয়ে টুল ব্যবহার করা ভালো, কারণ স্ট্রিংয়ের ভেতরের একটি কোটস বদলানোর পরিবর্তে এস্কেপ করতে হয়।

3. কোটস ছাড়া কী

{ name: "ana" }

অবজেক্টের কীগুলো স্ট্রিং, এবং স্ট্রিংয়ের কোটস থাকে। JavaScript অবজেক্ট লিটারালে আপনি কোটস বাদ দিতে পারেন, এবং সবসময় এখান থেকেই এই ত্রুটি আসে: কেউ কোনো সোর্স ফাইল থেকে একটি অবজেক্ট কপি করেছে এবং আশা করেছে এটি JSON। এটি JSON নয়।

4. মন্তব্য

{
  // the account owner
  "name": "ana"
}

JSON-এ মন্তব্য নেই। Douglas Crockford সচেতনভাবে সেগুলো সরিয়ে দিয়েছেন, কারণ মানুষ পার্সিং নির্দেশনা বহন করতে সেগুলো ব্যবহার করছিল। // এবং /* */ দুটোই ত্রুটি। যদি মন্তব্য গুরুত্বপূর্ণ হয়, সেগুলো একটি সোর্স ফাইলে রাখুন এবং সেখান থেকে JSON তৈরি করুন, অথবা নোটটি "_comment" এর মতো একটি প্রকৃত ফিল্ডে সরিয়ে নিন।

5. NaN, Infinity এবং undefined

{ "score": NaN, "limit": Infinity }

এদের কোনোটিই JSON-এ নেই। এদের জন্য কোনো সিনট্যাক্সই নেই, তাই ত্রুটি সাধারণত একটি অপ্রত্যাশিত অশুদ্ধ শব্দ হিসাবে দেখা যায়। Python যত্নহীনভাবে ফ্লোট ডাম্প করলে NaN এবং Infinity লেখে, এবং JavaScript অনুপস্থিত বৈশিষ্ট্য থেকে undefined তৈরি করে।

আপনাকে সিদ্ধান্ত নিতে হবে সেগুলো কী হবে, কারণ কোনো ক্ষতিহীন উত্তর নেই। null সবচেয়ে সাধারণ পছন্দ, "NaN" এর মতো একটি স্ট্রিং অন্যটি। মেরামত টুল null বাছাই করে এবং পুনর্বিন্যাস সংশোধন থেকে আলাদাভাবে পরিবর্তন তালিকাভুক্ত করে, কারণ এটি আপনার ডেটা পরিবর্তন করে শুধু ফরম্যাটিং নয়।

6. ভুল কেস কীওয়ার্ড

{ "active": True, "deleted": NULL }

JSON-এর কীওয়ার্ড লোয়ার কেস: true, false, null। True এবং None Python-এর, NULL SQL এবং C-এর। যে পার্সার “unexpected token T” বলে সে সবচেয়ে কম উপযোগী পদ্ধতিতে সত্য বলছে।

7. স্ট্রিংয়ের ভেতরে একটি নতুন লাইন

{ "note": "first line
second line" }

JSON স্ট্রিং একাধিক লাইনে বিস্তৃত হতে পারে না। লাইন ব্রেককে স্ট্রিংয়ের ভেতরে \n হিসাবে লিখতে হয়। এটি সাধারণ হয় যখন কেউ বহু-লাইনের টেক্সট হাতে কনফিগে পেস্ট করে, এবং ফলস্বরূপ ত্রুটি প্রায়শই পরের লাইনে ইঙ্গিত করে, খোলা রাখা স্ট্রিংয়ে নয়।

8. JSON অনুমোদন না করা সংখ্যা

{ "a": .5, "b": +1, "c": 007, "d": 1_000 }

চারটি আলাদা নিয়ম। একটি সংখ্যার দশমিক বিন্দুর আগে একটি অংক থাকতে হয়, তাই .5 মানে 0.5। শুরুতে প্লাস সাইন অনুমোদিত নয়। শুরুতে জিরো অনুমোদিত নয়, যা 007 প্রত্যাখ্যান করে। অংক সেপারেটর ভাষার বৈশিষ্ট্য, JSON-এর নয়।

9. একটি বন্ধ না হওয়া ব্র্যাকেট

{
  "user": {
    "name": "ana"
}

পার্সার ফাইলের শেষে পৌঁছায় এবং সেখানে রিপোর্ট করে, তাই বার্তা 200 লাইনের একটি দস্তাবেজের 200তম লাইন সম্পর্কে কিছু বলে যখন অনুপস্থিত ব্রেস 2য় লাইনে। এটি সেই ত্রুটি যার জন্য একটি ভালো টুল থাকা দরকার: এই সাইটের ভ্যালিডেটর খোলা এবং বন্ধ না হওয়া ব্র্যাকেটের অবস্থান রিপোর্ট করে, ইনপুটের শেষের পরিবর্তে।

যে দুটি ত্রুটি সিনট্যাক্স ত্রুটি নয়

দুটি দস্তাবেজ সম্পূর্ণ বৈধ হতে পারে এবং তবুও ভুল হতে পারে।

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

{ "region": "eu-west-1", "retries": 3, "region": "us-east-1" }

ভ্যালিডেটর ডুপ্লিকেটকে উভয় লাইন নম্বর সহ সতর্কতা হিসাবে রিপোর্ট করে, এবং তবুও দস্তাবেজকে বৈধ বলে, কারণ স্পেসিফিকেশন এটিই বলে।

একটি দীর্ঘ পূর্ণসংখ্যাও বিনা সমস্যায় পার্স হয়, এবং তারপর কিছু এটিকে ডাবলে পড়লে নির্ভুলতা হারায়:

{ "id": 12345678901234567890 }

একটি সাধারণ JSON লাইব্রেরি দিয়ে পড়লে আপনি পান 1234567890123567000। এখানকার টুলগুলো টোকেন স্ট্রিমে কাজ করে JavaScript মানে পার্স করার পরিবর্তে, তাই সংখ্যা ফরম্যাটিং, মিনিফিকেশন এবং তুলনায় অপরিবর্তিত থাকে। এটিই কারণ diff টুল কুড়ি অংকের দুটি পূর্ণসংখ্যাকে শুধু একই ফ্লোটিং পয়েন্ট মানে পতিত হওয়ার কারণে সমান বলবে না।

ত্রুটি বার্তা সঠিকভাবে পড়ার উপায়

দুটি অভ্যাস মানুষের সময়ের বেশিরভাগ অংশ বাঁচায়।

প্রথমে, রিপোর্ট করা অবস্থানকে সেখান বলে মনে করুন যেখানে পার্সার হার মানেছে, আপনি যেখানে ভুল করেন সেখান নয়। একটি অনুপস্থিত কমা পরবর্তী টোকেনে রিপোর্ট হয়, একটি বন্ধ না হওয়া ব্র্যাকেট ফাইলের শেষে, এবং একটি ট্রেইলিং কমা ক্লোজিং ব্রেসে।

দ্বিতীয়ত, রিপোর্ট করা অবস্থানের আগের অক্ষর চেক করুন। বেশিরভাগ ক্ষেত্রে আসল ত্রুটি অভিযোগের এক টোকেন আগে।

যদি কোনোটিই না করতে চান, দস্তাবেজটি ভ্যালিডেটরে পেস্ট করুন এবং বার্তা পড়ুন, যা ভুল কনস্ট্রাক্টের নাম বলে পার্স না হওয়া টোকেন উদ্ধৃত করার পরিবর্তে।

সব পোস্টে ফিরুন