JSON ফরম্যাট করা একটি টুলের জন্য সবচেয়ে সহজ কাজ মনে হতে পারে: কিছু
স্পেস এবং লাইন ব্রেক যোগ করা যাতে একজন মানুষ এটি পড়তে পারে।
বেশিরভাগ ফরম্যাটার ঠিক এটিই করে JSON.parse কল করে এবং তারপর
JSON.stringify কে ইন্ডেন্ট আর্গুমেন্ট সহ কল করে। এই রাউন্ড ট্রিপ
আপনার হাতে লেখা JSON এর জন্য কাজ করে এবং অন্য কোথা থেকে পাওয়া JSON
এর জন্য চুপচাপে ভেঙে পড়ে।
রাউন্ড ট্রিপের কারণে দুটি বাগ
JSON.parse প্রতিটি নম্বরকে JavaScript double এ পরিণত করে। একটি double
Number.MAX_SAFE_INTEGER (যা 9007199254740991) এর পরে প্রতিটি পূর্ণসংখ্যা
নির্ভুলভাবে ধরতে পারে না। একটি স্নোফ্লেক ID, ডাটাবেস প্রাথমিক কী, বা
ন্যানোসেকেন্ডে টাইমস্ট্যাম্প সহজেই এটি অতিক্রম করতে পারে, এবং
যখন তা হয়, পার্স করা মানকে পুনরায় সিরিয়ালাইজ করলে সংখ্যা পরিবর্তন
হয়। 12345678901234567890 12345678901234567000 হয়ে ফিরে আসে।
নম্বরটি কোথাও ডাউনস্ট্রিমে ভুল না হওয়া পর্যন্ত কেউ লক্ষ করে না।
এই রাউন্ড ট্রিপ নম্বরের মতো দেখতে Object কীগুলোকেও পুনর্বিন্যাস করে,
কারণ JSON.stringify একটি JavaScript Objectের নিজস্ব enumerable কীগুলো
একটি নির্দিষ্ট ক্রমে ঘুরে আসে: ইন্টিজার-মতো কী প্রথমে, বর্ধমান ক্রমে,
তারপর বাকি সব ইনসার্শন অর্ডারে। {"2": "b", "1": "a"} লেখা একটি
ডকুমেন্ট {"1": "a", "2": "b"} হয়ে ফিরে আসে, যা একটি ভিন্ন ডকুমেন্ট
যদিও প্রতিটি মান টিকে গেছে।
JSON ফরম্যাটার কী করে
এই টুলটি কখনই JSON.parse কল করে না। এটি আপনার ডকুমেন্টকে টোকেনাইজ
করে, RFC 8259 এর বিপরীতে টোকেন স্ট্রিম যাচাই করে, এবং সেই টোকেন থেকে
পুনরায় প্রিন্ট করে। একটি নম্বর আপনার লেখা সম্পূর্ণ অক্ষর হিসেবে
কপি করা হয়, ডাবল দিয়ে পুনরায় এনকোড করা হয় না। একটি কী যেখানে
আপনি রেখেছেন সেখানেই থাকে।
{"2":"second","1":"first","id":12345678901234567890,"note":"line1\nline2"}
ফরম্যাট চাপলে:
{
"2": "second",
"1": "first",
"id": 12345678901234567890,
"note": "line1\nline2"
}
"2" "1" এর আগে থাকে, এবং কুড়ি-সংখ্যার id ঠিক সেরকমই ফিরে আসে।
শুধু হোয়াইটস্পেস পরিবর্তন হয়েছে।
ত্রুটি পড়া
ডকুমেন্টটি যদি বৈধ JSON না হয়, টুলটি সমস্যাযুক্ত লাইনকে গাটারে মার্ক করে এবং আসল ভুলটির নাম দেয় সেই টোকেন উদ্ধৃত করার পরিবর্তে যেখানে এটি আটকে গেছিল। একটি বন্ধ ব্রেসের আগের ট্রেইলিং কমা ট্রেইলিং কমা হিসেবে রিপোর্ট করা হয়, কমাটি যে লাইনে আছে সেখানে, ফাইলের শেষে নয় যেখানে একটি সাধারণ পারসার হারিয়ে যায়।
ফরম্যাট vs মিনিফাই
উভয় বাটনই টোকেন থেকে একই পুনরায় প্রিন্ট করে; শুধু হোয়াইটস্পেস আলাদা। ফরম্যাট লাইন ব্রেক এবং আপনার বেছে নেওয়া ইন্ডেন্ট প্রস্থ যোগ করে (২ স্পেস, ৪ স্পেস, বা একটি ট্যাব)। মিনিফাই JSON এর প্রয়োজন নেই এমন প্রতিটি স্পেস, ট্যাব এবং লাইন ব্রেক সরিয়ে ফেলে। কোনোটিই একটি মান পরিবর্তন করে না, তাই যতবার খুশি যেকোনো বাটন চাপা নিরাপদ, অথবা পুনরায় পেস্ট না করে এক থেকে অন্যে পরিবর্তন করা যায়।
এটি একটি লম্বা ID বা সংখ্যাসূচক কী থাকা কনফিগ ফাইলের সাথে চেষ্টা
করুন, এবং JSON.parse দিয়ে যাওয়া একটি ফরম্যাটারের সাথে ফলাফল
তুলনা করুন। পার্থক্য তৎক্ষণাৎ দেখা যায়।