JSON
13 tools
JSON কী?
JSON (JavaScript Object Notation) একটি হালকা, টেক্সট-ভিত্তিক ডেটা বিনিময় ফরম্যাট যা মানুষের পড়তে ও লিখতে এবং মেশিনের পার্স ও জেনারেট করতে সহজ। মূলত JavaScript থেকে উদ্ভূত হলেও JSON ভাষা-নিরপেক্ষ এবং এখন ওয়েবে ডেটা বিনিময়ের de facto মান।
JSON ডেটাকে অবজেক্ট ও অ্যারেতে সংগঠিত কী-ভ্যালু জোড়া হিসেবে উপস্থাপন করে। এর সরলতা এটিকে REST API, কনফিগারেশন ফাইল এবং ডেটা স্টোরেজের জন্য প্রভাবশালী ফরম্যাটে পরিণত করেছে — বেশিরভাগ আধুনিক অ্যাপ্লিকেশনে আরও বিস্তারিত XML-কে প্রতিস্থাপন করে।
সংক্ষিপ্ত ইতিহাস
JSON ২০০০-এর দশকের শুরুতে Douglas Crockford কর্তৃক আনুষ্ঠানিক রূপ পায়, যদিও ফরম্যাটটি JavaScript সিনট্যাক্সে ইতিমধ্যে অন্তর্নিহিত ছিল। স্পেসিফিকেশনটি ২০০১ সালে json.org-এ প্রকাশিত হয়। RFC 4627 ২০০৬ সালে এবং বর্তমান ECMA-404 মান ২০১৩ সালে প্রকাশিত হয়।
JSON-এর আগে XML ওয়েবে ডেটা বিনিময়ের প্রধান ফরম্যাট ছিল। JSON-এর মিনিমালিজম — কোনো অ্যাট্রিবিউট, প্রসেসিং নির্দেশনা বা নেমস্পেস নেই — এটিকে AJAX অ্যাপ্লিকেশন তৈরিকারী ডেভেলপারদের মধ্যে তাৎক্ষণিকভাবে জনপ্রিয় করে তোলে। ২০১০ সালের মধ্যে JSON মূলত ওয়েব API-এ XML-কে সরিয়ে দেয়।
JSON ডেটা টাইপ
JSON ঠিক ছয়টি ডেটা টাইপ সমর্থন করে। একটি বৈধ JSON ডকুমেন্টের প্রতিটি মান এর মধ্যে একটি হতে হবে:
"hello world"ডাবল কোটে আবদ্ধ Unicode অক্ষরের যেকোনো ক্রম। ব্যাকস্ল্যাশ এস্কেপ সিকোয়েন্স (\n, \t, \") সমর্থিত।
42 / 3.14 / 1e10পূর্ণসংখ্যা বা ফ্লোটিং-পয়েন্ট। বৈজ্ঞানিক স্বরলিপি (1e10) অনুমোদিত। JSON স্তরে int এবং float-এর মধ্যে কোনো পার্থক্য নেই।
true / falseআক্ষরিক টোকেন true বা false (শুধুমাত্র ছোট হাতে)। কোনো truthy/falsy নেই — শুধুমাত্র কঠোর boolean।
nullআক্ষরিক টোকেন null (ছোট হাতে)। মানের অনুপস্থিতি বোঝায়। undefined থেকে আলাদা, যা JSON টাইপ নয়।
[1, "two", null]বর্গাকার বন্ধনীতে আবদ্ধ মানের একটি সুশৃঙ্খল তালিকা। উপাদান মিশ্র ধরনের হতে পারে এবং অ্যারে ইচ্ছামতো নেস্ট করা যায়।
{"key": "value"}কার্লি ব্রেসে আবদ্ধ কী-ভ্যালু জোড়ার একটি অক্রমিক সংগ্রহ। কী অবশ্যই স্ট্রিং হতে হবে। মান যেকোনো JSON টাইপ হতে পারে।
{
"string": "hello world",
"number": 42,
"float": 3.14,
"boolean": true,
"null": null,
"array": [1, 2, 3],
"object": { "nested": "value" }
}JSON সিনট্যাক্স নিয়ম
JSON-এর কঠোর সিনট্যাক্স নিয়ম রয়েছে। সামান্য বিচ্যুতি পার্স ত্রুটির কারণ হয়। মনে রাখার জন্য সবচেয়ে গুরুত্বপূর্ণ ছয়টি নিয়ম এখানে দেওয়া হলো:
সমস্ত স্ট্রিং মান এবং অবজেক্ট কী অবশ্যই ডাবল কোট ব্যবহার করতে হবে। সিঙ্গেল কোট বৈধ JSON নয়। JavaScript থেকে আসা ডেভেলপারদের এটি সবচেয়ে সাধারণ ভুল।
JSON অ্যারের শেষ উপাদান বা অবজেক্টের শেষ প্রপার্টির পরে ট্রেইলিং কমা অনুমোদন করে না। [1, 2, 3,] এবং {"a": 1,} উভয়ই অবৈধ।
JSON-এ কোনো কমেন্ট সিনট্যাক্স নেই। // এবং /* */ বৈধ নয়। কনফিগ ফাইলে কমেন্টের প্রয়োজন হলে JSON5 বা YAML বিবেচনা করুন, যা উভয়ই কমেন্ট সমর্থন করে।
JSON শুধুমাত্র ছয়টি প্রিমিটিভ টাইপ সমর্থন করে। undefined, NaN, Infinity এবং ফাংশনের মতো JavaScript মানগুলি উপস্থাপন করা যায় না এবং সিরিয়ালাইজেশনের সময় হয় বাদ দেওয়া হয় নয়তো null-এ রূপান্তরিত হয়।
সমস্ত অবজেক্ট কী অবশ্যই কোটেড স্ট্রিং হতে হবে। নিউমেরিক কী, বেয়ার আইডেন্টিফায়ার বা অন্যান্য টাইপ অনুমোদিত নয়। কী অনন্য হওয়া উচিত, যদিও বেশিরভাগ পার্সার ডুপ্লিকেট গ্রহণ করে।
JSON কেস-সংবেদনশীল। true, false এবং null অবশ্যই সম্পূর্ণ ছোট হাতে হতে হবে। TRUE, False, NULL বা Null অবৈধ টোকেন এবং পার্স ত্রুটি ঘটাবে।
অবৈধ বনাম বৈধ JSON
{
'name': 'Alice', // single quotes — invalid
age: 30, // unquoted key — invalid
"scores": [1, 2, 3,], // trailing comma — invalid
"note": undefined // undefined — invalid
}{
"name": "Alice",
"age": 30,
"scores": [1, 2, 3],
"note": null
}আধুনিক ওয়েবে JSON
REST API
JSON হলো REST API রিকোয়েস্ট এবং রেসপন্সের জন্য আদর্শ বডি ফরম্যাট। Content-Type: application/json আধুনিক ওয়েবে সবচেয়ে সাধারণ MIME টাইপ। কার্যত প্রতিটি প্রোগ্রামিং ভাষায় একটি বিল্ট-ইন JSON পার্সার রয়েছে, যা ইন্টারঅপারেবিলিটি নির্বিঘ্ন করে তোলে।
কনফিগারেশন ফাইল
package.json, tsconfig.json, .eslintrc এবং অনেক অন্যান্য ডেভেলপার টুলস কনফিগারেশনের জন্য JSON ব্যবহার করে। কাঠামোগত ফরম্যাট এবং সর্বজনীন পার্সার সমর্থন এটিকে ব্যবহারিক করে তোলে, যদিও কমেন্টের অভাব একটি স্থায়ী সমালোচনা।
NoSQL ডেটাবেস
MongoDB, CouchDB এবং Amazon DynamoDB-এর মতো ডকুমেন্ট ডেটাবেসগুলি JSON বা JSON-সদৃশ ডকুমেন্ট হিসেবে ডেটা সংরক্ষণ করে। এটি নমনীয়, স্কিমা-মুক্ত স্টোরেজ সক্ষম করে যা স্বাভাবিকভাবে অ্যাপ্লিকেশন অবজেক্টের সাথে ম্যাপ করে।
ফ্রন্টএন্ড স্টেট ও ডেটা
localStorage এবং sessionStorage স্ট্রিং সংরক্ষণ করে, তাই JavaScript অবজেক্ট সিরিয়ালাইজ করতে JSON.stringify/JSON.parse ক্রমাগত ব্যবহার করা হয়। fetch() থেকে API রেসপন্স JSON টেক্সট হিসেবে আসে এবং ব্যবহারের আগে পার্স করা হয়।
JSON বনাম অন্যান্য ফরম্যাট
JSON সবসময় সেরা পছন্দ নয়। এখানে দেখানো হলো এটি অন্যান্য সাধারণ ডেটা ফরম্যাটের সাথে কীভাবে তুলনা করে:
সহজ সিনট্যাক্স, ছোট ফাইল সাইজ, পার্স করা সহজ, ডেভেলপারদের জন্য আরও পাঠযোগ্য
অ্যাট্রিবিউট, প্রসেসিং নির্দেশনা বা XML নেমস্পেসের জন্য সমর্থন নেই
আপনার ডকুমেন্ট মেটাডেটা, মিশ্র কন্টেন্ট মডেল বা XML স্কিমা (XSD/XSLT) প্রয়োজন
কঠোর সিনট্যাক্স (কম অস্পষ্টতা), আরও ভালো টুলিং সমর্থন, আরও পোর্টেবল
কমেন্ট সমর্থন নেই, গভীরভাবে নেস্টেড ডেটার জন্য সামান্য বেশি বিস্তারিত
মানুষ-সম্পাদনযোগ্য কনফিগ ফাইল, Docker Compose, GitHub Actions, Kubernetes manifests
বৃহত্তর ইকোসিস্টেম সমর্থন, দ্রুততর পার্সিং, আরও পূর্বানুমানযোগ্য টাইপ হ্যান্ডলিং
নেটিভ ডেট টাইপ নেই, জটিল নেস্টেড স্ট্রাকচারের জন্য কম মানব-বান্ধব
Rust (Cargo.toml), Python (pyproject.toml), INI-স্টাইল অ্যাপ্লিকেশন কনফিগারেশন
কাঠামোগত ও নেস্টেড ডেটা, সমতল সারি ও কলামে সীমাবদ্ধ নয়
অনেক বড় ফাইল সাইজ, সম্পূর্ণ ট্যাবুলার ডেটার জন্য দুর্বল পারফরম্যান্স
স্প্রেডশিট ডেটা, ডেটাবেস এক্সপোর্ট, Excel বা pandas-এ খোলার জন্য ডেটা
JSON Schema
JSON Schema হলো JSON ডকুমেন্টের স্ট্রাকচার যাচাই করার জন্য একটি শব্দভান্ডার। একটি স্কিমা JSON মানের প্রত্যাশিত টাইপ, প্রয়োজনীয় ফিল্ড এবং বাধ্যবাধকতা (minimum, maximum, pattern) বর্ণনা করে। বর্তমান সংস্করণ হলো JSON Schema 2020-12।
ajv (JavaScript), jsonschema (Python) এবং অনেক IDE-তে বিল্ট-ইন ভ্যালিডেটরের মতো টুলস JSON Schema সমর্থন করে। OpenAPI (পূর্বে Swagger) API রিকোয়েস্ট ও রেসপন্স বডি বর্ণনা করতে JSON Schema ব্যবহার করে, এটিকে আধুনিক API ডকুমেন্টেশনের মেরুদণ্ড করে তোলে।
সাধারণ JSON সমস্যা
JSON সংখ্যা IEEE 754 ডাবল-প্রিসিশন ফ্লোট হিসেবে পার্স করা হয়। 2^53-এর বেশি পূর্ণসংখ্যা নির্ভুলতা হারায়। বড় ID (Twitter snowflakes, database bigints) সংখ্যা হিসেবে নয়, স্ট্রিং হিসেবে পাস করুন।
JSON-এ কোনো ডেট টাইপ নেই। তারিখগুলি সাধারণত ISO 8601 স্ট্রিং বা Unix টাইমস্ট্যাম্প হিসেবে সিরিয়ালাইজ করা হয়। আপনার কোডকে জানতে হবে কোন কনভেনশন ব্যবহার করা হয়েছে — JSON থেকে এটি অনুমান করার কোনো উপায় নেই।
JSON.stringify সার্কুলার অবজেক্ট রেফারেন্সে TypeError ছুঁড়ে দেয়। আপনাকে চক্র ভাঙতে হবে বা এটি পরিচালনা করে এমন একটি লাইব্রেরি ব্যবহার করতে হবে (json-stringify-safe, flatted)।
JSON অবশ্যই UTF-8, UTF-16 বা UTF-32 হিসেবে এনকোড করতে হবে। UTF-8 মানসম্পন্ন। JSON ফাইলের শুরুতে একটি Byte Order Mark (BOM) প্রযুক্তিগতভাবে অ-সম্মত এবং কিছু পার্সার ভেঙে দেয়।
অবিশ্বস্ত JSON পার্স করার সময়, পার্স করা অবজেক্টগুলিকে বিদ্যমানগুলিতে মার্জ করা __proto__ কী-এর মাধ্যমে প্রোটোটাইপ পলিউশন আক্রমণের জন্য দুর্বল হতে পারে। সর্বদা বাহ্যিক উৎস থেকে JSON যাচাই বা স্যানিটাইজ করুন।
{"key": null} এবং একটি অনুপস্থিত "key" শব্দার্থগতভাবে আলাদা। Null মানে ফিল্ডটি অনুপস্থিত মান সহ বিদ্যমান; অনুপস্থিত মানে ফিল্ডটি নির্দিষ্ট করা হয়নি। JSON Schema উভয় পার্থক্য প্রকাশ করতে পারে।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
JSON মানে JavaScript Object Notation। নামের পরেও, JSON সম্পূর্ণ ভাষা-নিরপেক্ষ এবং কার্যত প্রতিটি প্রোগ্রামিং ভাষায় সমর্থিত।
না। JSON একটি টেক্সট ফরম্যাট যা JavaScript অবজেক্ট লিটারালের মতো দেখতে, কিন্তু এর কঠোর নিয়ম রয়েছে: কী অবশ্যই ডাবল-কোটেড হতে হবে এবং এটি undefined, ফাংশন বা কমেন্ট সমর্থন করে না। একটি JSON ডকুমেন্ট সর্বদা একটি স্ট্রিং, মেমরিতে থাকা অবজেক্ট নয়।
না। JSON স্পেসিফিকেশনে কমেন্ট সিনট্যাক্স অন্তর্ভুক্ত নেই। আপনি যদি // বা /* */ কমেন্ট যোগ করেন, তাহলে আপনার ফাইলটি আর বৈধ JSON নয়। কমেন্টের প্রয়োজন এমন কনফিগ ফাইলের জন্য JSONC, JSON5 বা YAML বিবেচনা করুন।
JSONP (JSON with Padding) ছিল ব্রাউজারের same-origin পলিসির একটি ওয়ার্কঅ্যারাউন্ড যা JSON-কে একটি ফাংশন কলে মোড়ানো হতো। এটি অপ্রচলিত — পরিবর্তে CORS ব্যবহার করুন। আধুনিক ব্রাউজার Cross-Origin Resource Sharing সম্পূর্ণরূপে সমর্থন করে।
JavaScript-এ: JSON.stringify(data, null, 2) ২-স্পেস ইন্ডেন্টেশন যোগ করে। Python-এ: json.dumps(data, indent=2)। টার্মিনালে: cat file.json | python3 -m json.tool অথবা cat file.json | jq .
NDJSON (Newline Delimited JSON) প্রতি লাইনে একটি JSON অবজেক্ট সংরক্ষণ করে। প্রতিটি লাইন স্বাধীনভাবে পার্স করা যায়, স্ট্রিমিং সক্ষম করে। এটি লগ ফাইল, ইভেন্ট স্ট্রিম এবং বড় ডেটা এক্সপোর্টের জন্য জনপ্রিয়।
টোকেনের মধ্যে হোয়াইটস্পেস তুচ্ছ। {"a":1} এবং { "a" : 1 } অভিন্ন। ফরম্যাটিং স্টাইল ও পাঠযোগ্যতার বিষয়, শব্দার্থের নয়।
JSON স্পেসিফিকেশন কোনো আকার সীমা নির্ধারণ করে না। বাস্তবে আপনি পার্সার মেমরি এবং নেটওয়ার্ক ট্রান্সফার দ্বারা সীমাবদ্ধ। বেশিরভাগ HTTP ফ্রেমওয়ার্ক ডিফল্ট বডি সাইজ সীমা আরোপ করে (১–১০ MB)। বড় ডেটার জন্য স্ট্রিমিং পার্সার বা MessagePack-এর মতো বাইনারি ফরম্যাট বিবেচনা করুন।
সরাসরি নয়। JSON একটি টেক্সট ফরম্যাট। বাইনারি ডেটা (ছবি, ফাইল) JSON-এ এম্বেড করার আগে Base64-এনকোড করতে হবে, যা আকার প্রায় ৩৩% বাড়িয়ে দেয়। বাইনারি-ভারী ডেটার জন্য multipart/form-data বা CBOR-এর মতো বাইনারি ফরম্যাট বিবেচনা করুন।
JSON5 হলো JSON-এর একটি সুপারসেট যা যোগ করে: আনকোটেড কী, সিঙ্গেল-কোটেড স্ট্রিং, ট্রেইলিং কমা, কমেন্ট এবং মাল্টি-লাইন স্ট্রিং। মানুষের লেখার জন্য সহজ কিন্তু আলাদা পার্সার প্রয়োজন। Babel কনফিগ এবং কিছু বিল্ড টুলিংয়ে ব্যবহৃত।