ট্রেইলিং কমা কেন JSON ভাঙে
সংক্ষেপে: ট্রেইলিং কমা JavaScript অবজেক্ট লিটেরালে বৈধ আর JSON-এ মারাত্মক। সঠিক এরর, যে RFC 8259 ব্যাকরণ এর কারণ, আর তিনটি সমাধান যা সত্যিই টেকে।

মূল কথা: JSON সর্বত্র ট্রেইলিং কমা নিষিদ্ধ করে — পার্সার ব্যর্থ হলে ফরম্যাটার দিয়ে শেষ কমাটি মুছুন; JSON5 বা JSONC কেবল লোকাল শিথিল পার্সিংয়ে ব্যবহার করুন, আর অন্য সিস্টেমে সবসময় স্ট্যান্ডার্ড JSON দিন।
কারণ ব্যাকরণ এমনই বলে।
{
"name": "demo",
"size": 12,
}
JSON.parse throws Unexpected token } in JSON at position 34। Node ভিন্নভাবে লেখে, কিন্তু প্রতিটি ইঞ্জিন একই জায়গায় ইশারা করে: }-এর আগের কমা।
পার্সার আসলে কী নিয়ে অভিযোগ করছে
RFC 8259-এ অবজেক্ট উৎপাদন:
object = begin-object [ member *( value-separator member ) ] end-object
স্কোয়্যার ব্র্যাকেট মানে ঐচ্ছিক, তারকা মানে শূন্য বা বেশি। সাধারণ ভাষায়: কমা সদস্য আলাদা করে, আর শেষ সদস্যের ঠিক পরেই }।
তাই কমার পরে পার্সার আরেকটি সদস্য-নামের জন্য তৈরি। সে } পড়ে আর ব্যর্থ হয়। অ্যারেও একই — [1, 2, 3,] ]-এ ব্যর্থ।
অভ্যাস কোথা থেকে আসে
JavaScript অবজেক্ট লিটেরাল ES5 থেকে ট্রেইলিং কমা অনুমোদন করে, যেমন Python লিস্ট ও Go কম্পোজিট লিটেরাল। এডিটর স্বয়ংক্রিয়ভাবে যোগ করে। তারপর কেউ .js ফাইল থেকে অবজেক্ট লিটেরাল কপি করে .json ফাইলে রাখে আর ফাইল পার্স হওয়া বন্ধ করে।
আরেক সাধারণ উৎস হাতে বানানো JSON: i <= length চালানো লুপ শেষ এলিমেন্টের পরে একটি কমা রেখে দেয়।
তিনটি সমাধান
কমা সরান। হাতের সম্পাদনায় ঠিক। JSON ফরম্যাটার-এ পেস্ট করলে লাইন ও কলামসহ এরর রিপোর্ট হয়, তাই ঠিক কোনটি মুছবেন দেখতে পান।
JSON5 হিসেবে পার্স করুন। সুপারসেট ট্রেইলিং কমা গ্রহণ করে, যা লোকাল কনফিগে ঠিক। অন্য সিস্টেমে পাঠানো যেকোনো কিছুর জন্য ঠিক নয় — গ্রহীতা তবু প্রত্যাখ্যান করবে।
স্ট্রিং জোড়া লাগানো বন্ধ করুন। JSON.stringify, json.dumps, Jackson ব্যবহার করুন। সিরিয়ালাইজার বিভাজক ঠিকভাবে সামলায় আর একসঙ্গে এস্কেপিংও সমাধান করে।
দ্রুত অডিট তালিকা
| কোথায় | সাধারণ কারণ |
|---|---|
| লুপ কনক্যাটেনেশন | i <= length একটি বাড়তি কমা রেখে দেয় |
| কপি-পেস্ট | JS ফাইল থেকে তোলা অবজেক্ট লিটেরাল |
| টেমপ্লেট | হার্ডকোড করা কমা প্লাস আরেকটি যোগ করা লুপ |
| হাতে সম্পাদনা | শেষ ফিল্ড মোছা হয়েছে, তার কমা রয়ে গেছে |
সাধারণ প্রশ্ন
JavaScript-এ ট্রেইলিং কমা বৈধ, কিন্তু JSON-এ নয় কেন?
JavaScript অবজেক্ট লিটেরাল ES5 থেকে অনুমোদন করে, Python লিস্ট ও Go কম্পোজিট লিটেরালও, এজন্যই অভ্যাস মানুষকে JSON-এ পৌঁছে দেয়। RFC 8259 কমা কেবল সদস্যের মধ্যে অনুমোদন করে: শেষ সদস্যের ঠিক পরে } বা ]। .js ফাইল থেকে অবজেক্ট লিটেরাল কপি করে .json ফাইলে রাখাই সাধারণ উৎস।
ট্রেইলিং কমা গ্রহণ করতে JSON5 হিসেবে পার্স করা উচিত?
কেবল লোকাল কনফিগারেশনের জন্য। সুপারসেট ট্রেইলিং কমা গ্রহণ করে, কিন্তু অন্য সিস্টেমে পাঠানো যেকোনো কিছু কঠোর JSON হিসেবে পার্স হয় আর তবু ব্যর্থ হবে। গ্রহীতার শিথিলতার উপর ভরসা না করে আউটপুট সীমানায় স্ট্যান্ডার্ড JSON জেনারেট করুন।
ট্রেইলিং কমা এররের পর প্রথমে কোথায় দেখব?
এরর মেসেজের অবস্থান দিয়ে শুরু করুন: সাধারণত } বা ]-এর আগের কমায় ইশারা করে। তারপর তিন সাধারণ উৎস দেখুন: i <= length দিয়ে লেখা লুপ, JS ফাইল থেকে পেস্ট করা অবজেক্ট লিটেরাল, আর কমা হার্ডকোড করা টেমপ্লেটের পাশে লুপ। ফরম্যাটারে পেস্ট করলে ঠিক লাইন ও কলাম রিপোর্ট হয়।