পাইথন ডেটা এবং JSON এর জন্য প্রোগ্রামারের নির্দেশিকা

সর্বশেষ আপডেট: 12/29/2025
লেখক: C SourceTrail
  • JSON পাইথনের মূল প্রকারের সাথে পরিষ্কারভাবে ম্যাপ করে, যেখানে অবজেক্ট এবং অ্যারেগুলিকে ডিক্ট এবং তালিকা হিসাবে উপস্থাপন করা হয়, যা ডেটা আদান-প্রদানকে সহজ করে তোলে।
  • পাইথনের json মডিউলটি সুন্দর প্রিন্টিং, কাস্টম এনকোডার এবং স্থিতিশীল কী অর্ডারিংয়ের বিকল্প সহ নমনীয় ডাম্প/লোড ফাংশন প্রদান করে।
  • ফাইল এবং API থেকে নেস্টেড JSON পড়া, লেখা এবং পার্স করা একই মূল সরঞ্জামের উপর নির্ভর করে, সতর্কতার সাথে ত্রুটি পরিচালনার সাথে মিলিত হয়।
  • মৌলিক সিরিয়ালাইজেশনের বাইরে, পাইথনে JSON ফর্ম্যাটিং, ভ্যালিডেশন এবং CSV এবং XML এর মতো অন্যান্য ডেটা ফর্ম্যাটের সাথে ইন্টিগ্রেশন সমর্থন করে।

পাইথন JSON ডেটা টিউটোরিয়াল

JSON এখন নীরবে ওয়েবে ডেটার জন্য ডিফল্ট ভাষা হয়ে উঠেছে, এবং যদি আপনি পাইথন লেখেন, তাহলে আপনি সর্বত্র এটির সাথে ধাক্কা খাবেন: API, কনফিগারেশন ফাইল, পার্শ্ব প্রকল্পের জন্য ছোট "ডাটাবেস", লগ এবং এমনকি পরীক্ষার ফিক্সচার। পাইথনের ডেটা টাইপগুলি কীভাবে JSON-এ ম্যাপ করে এবং কীভাবে json মডিউলটি সত্যিই কাজ করে, সেই দক্ষতাগুলির মধ্যে একটি যা হঠাৎ করে অনেক দৈনন্দিন কাজ সহজ করে তোলে।

এই নির্দেশিকাটি একজন পাইথন প্রোগ্রামারের দৃষ্টিকোণ থেকে JSON সম্পর্কে আলোচনা করবে, JSON কী, এটি কীভাবে জাভাস্ক্রিপ্টের সাথে সম্পর্কিত, এটি কোন ধরণের পাইথন উপস্থাপন করতে পারে এবং কীভাবে JSON ব্যবহার করে পার্স, জেনারেট, প্রিটি-প্রিন্ট, ভ্যালিড এবং কাস্টমাইজ করা যায় তা ব্যাখ্যা করা হচ্ছে json। আমরা বাস্তব জগতের ব্যবহারের ক্ষেত্রেও দেখব, যেমন ফাইল এবং API নিয়ে কাজ করা, এবং নেস্টেড ডেটা পরিচালনা করার কৌশল এবং ত্রুটি বা বিশেষ মান যেমন এজ কেসগুলিও দেখব। NaN এবং অসীম।

JSON কী এবং এটি পাইথন ডেটার সাথে কীভাবে সম্পর্কিত?

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

ধারণাগতভাবে, JSON মাত্র দুটি যৌগিক বিল্ডিং ব্লক ব্যবহার করে: জাভাস্ক্রিপ্ট লক্ষ্য এবং জাভাস্ক্রিপ্ট বিন্যাস। একটি অবজেক্ট অনেকটা পাইথন অভিধানের মতো আচরণ করে এবং একটি অ্যারে পাইথন তালিকার মতো আচরণ করে। এই দুটি, এবং কিছু ছোট আদিম ধরণের সেটের সাহায্যে, JSON জটিল নেস্টেড ডেটা স্ট্রাকচার বর্ণনা করতে পারে।

জাভাস্ক্রিপ্ট (এবং JSON) এর একটি অবজেক্ট দেখতে এরকম: {"key1": value1, "key2": value2}। এটি কী-মান জোড়ার একটি সংগ্রহ, যেখানে কীগুলি স্ট্রিং এবং মানগুলি যেকোনো বৈধ JSON মান হতে পারে (অন্যান্য বস্তু বা অ্যারে সহ)। এটি একটি পাইথনের সাথে ঘনিষ্ঠভাবে মিলে যায়। dict.

জাভাস্ক্রিপ্টের (এবং JSON) একটি অ্যারে পাইথন তালিকার অনুরূপ: । এটি মানগুলির একটি ক্রমানুসারে সংগ্রহ, আবার যেকোনো বৈধ JSON টাইপ ব্যবহার করে। একসাথে, অবজেক্ট এবং অ্যারেগুলিকে ব্যবহারকারীর প্রোফাইল, কনফিগারেশন ট্রি, বা API প্রতিক্রিয়ার মতো সমৃদ্ধ ডেটা মডেল করার জন্য ইচ্ছামত নেস্ট করা যেতে পারে।

JSON প্রকার এবং পাইথন প্রকারের মধ্যে ম্যাপিং খুবই সহজ, এই কারণেই মাঝে মাঝে আপনি লোকেদের মজা করে "PYON" (পাইথন অবজেক্ট নোটেশন) বলতে শুনতে পান। যখন পাইথন JSON এনকোড বা ডিকোড করে, তখন নিম্নলিখিত সঙ্গতিগুলি প্রযোজ্য হয়:

  • JSON অবজেক্ট → পাইথন dict
  • JSON অ্যারে → পাইথন list
  • JSON স্ট্রিং → পাইথন str
  • JSON নম্বর (পূর্ণসংখ্যা) → পাইথন int
  • JSON নম্বর (বাস্তব) → পাইথন float
  • তাদেরকে JSON true পাইথন True
  • তাদেরকে JSON false পাইথন False
  • তাদেরকে JSON null পাইথন None

একটি গুরুত্বপূর্ণ সীমাবদ্ধতা হল যে JSON অবজেক্ট কীগুলি সর্বদা স্ট্রিং হয়, তাই যদি আপনি একটি পাইথন এনকোড করেন dict নন-স্ট্রিং কী (যেমন, পূর্ণসংখ্যা বা টিপল) সহ, সেই কীগুলি স্ট্রিংগুলিতে জোর করে চাপিয়ে দেওয়া হবে অথবা আপনার সেটিংসের উপর নির্ভর করে ত্রুটি তৈরি করবে। JSON কনফিগারেশন বা রেকর্ডের মতো স্ট্রাকচার্ড ডেটা ধরে রাখার জন্য দুর্দান্ত, তবে এটি না পাইথন বস্তুর জন্য একটি সাধারণ পিকলিং প্রক্রিয়া।

পাইথন JSON ডেটা ম্যাপিং

পাইথনের অন্তর্নির্মিত json মডিউল

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

আপনি বেশিরভাগ সময় যে চারটি মূল ফাংশন ব্যবহার করবেন তা হল: json.dumps() এবং json.dump() পাইথন অবজেক্টগুলিকে JSON-এ রূপান্তর করার জন্য, এবং json.loads() এবং json.load() JSON থেকে Python টাইপে ফিরে যাওয়ার জন্য। "s" ভার্সনগুলি স্ট্রিং দিয়ে কাজ করে, যখন "s" ছাড়া ভার্সনগুলি ফাইলের মতো বস্তু দিয়ে কাজ করে।

সার্জারির json এনকোডার ডিফল্টরূপে পাইথন ধরণের একটি নির্দিষ্ট সেট সমর্থন করে, যথা dict, list, tuple (অ্যারে হিসেবে), str, সংখ্যা (int, float, এবং পূর্ণসংখ্যা/ভাসমান-প্রাপ্ত এনাম), এবং তিনটি বিশেষ একক সংখ্যা True, False, এবং None। পূর্বে বর্ণিত ম্যাপিং অনুসারে এগুলি তাদের JSON সমতুল্য রূপান্তরিত হয়।

যদি আপনার কাস্টম অবজেক্ট বা ডেটা টাইপ সিরিয়ালাইজ করার প্রয়োজন হয়, মডিউলটির নকশা এক্সটেনসিবল: আপনি JSON এনকোডারটিকে সাবক্লাস করতে পারেন এবং বাস্তবায়ন করতে পারেন default() পদ্ধতি, অথবা একটি কাস্টম পাস করুন default মধ্যে ফাংশন json.dump() / json.dumps(). সেই কাস্টম হুকটি JSON-serializable কিছু ফেরত দেবে (যেমন একটি dict or list), অথবা বাড়ান TypeError যদি এটি প্রদত্ত বস্তুটি কীভাবে পরিচালনা করতে হয় তা জানে না।

হুডের নিচে, মডিউলটি এমন পদ্ধতিও অফার করে যেমন encode() এবং iterencode(), যা পাইথন ডেটাকে JSON স্ট্রিংয়ে রূপান্তর করে, iterencode() এনকোডেড অংশগুলি ক্রমবর্ধমানভাবে প্রদান করা হচ্ছে। এগুলি সরাসরি কম ব্যবহৃত হয় তবে যদি আপনার খুব বড় JSON প্রতিক্রিয়া স্ট্রিম করার প্রয়োজন হয় তবে এগুলি সম্পর্কে জানা মূল্যবান।

পাইথন অবজেক্টগুলিকে JSON-এ রূপান্তর করা

যখন আপনি পাইথন ডেটাকে JSON টেক্সটে রূপান্তর করতে চান, তখন আপনি ব্যবহার করেন json.dump() or json.dumps(), আপনি সরাসরি কোনও ফাইলে লিখতে চান নাকি মেমোরিতে JSON স্ট্রিং পেতে চান তার উপর নির্ভর করে। উভয় ফাংশন একই মূল পরামিতি ভাগ করে যা আপনাকে রূপান্তর কীভাবে আচরণ করে তা নিয়ন্ত্রণ করতে দেয়।

কাজ json.dump(obj, fp, ...) একটি পাইথন অবজেক্ট এবং একটি ফাইলের মতো অবজেক্ট নেয়, এবং এর একটি JSON উপস্থাপনা লেখে obj সেই ফাইলে। এটি মেমরির প্রতিরূপ, json.dumps(obj, ...), ফাইলে লেখার পরিবর্তে একটি JSON স্ট্রিং ফেরত দেয়। তারা উভয়ই কীওয়ার্ড আর্গুমেন্টের একটি সিরিজ গ্রহণ করে যেমন skipkeys, ensure_ascii, check_circular, allow_nan, indent, separators, default, এবং sort_keys.

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

ব্যবহারিক দিক থেকে প্রধান পরামিতিগুলির অর্থ এখানে দেওয়া হল:

  • skipkeys: যদি সেট করা হয় True, অভিধান কী যা এই ধরণের নয় str, int, float, bool or None নীরবে উত্থাপনের পরিবর্তে এড়িয়ে যাওয়া হয় TypeError. যদি আপনি চাবিগুলি অদ্ভুত হলে দ্রুত ব্যর্থ আচরণ পছন্দ করেন, তাহলে এটিকে এভাবেই ছেড়ে দিন False.
  • ensure_ascii: কখন True (ডিফল্ট), অ-ASCII এবং অ-মুদ্রণযোগ্য অক্ষরগুলি এড়িয়ে যাওয়া হয় (যেমন \uXXXX) তাই আউটপুটটি বিশুদ্ধ ASCII থাকে। যখন False, ইউনিকোড অক্ষরগুলি যেমন আছে তেমন লেখা হয়, যা সাধারণত মানুষের পাঠযোগ্য কনফিগারেশন বা লগের জন্য ভালো।
  • check_circular: if True, এনকোডারটি অসীম পুনরাবৃত্তি রোধ করার জন্য তালিকা, ডিক্ট এবং কাস্টম এনকোডেড বস্তুতে বৃত্তাকার রেফারেন্স পরীক্ষা করে। এটিকে সেট করা হচ্ছে False সেই নিরাপত্তা জালটি অক্ষম করে এবং এর ফলে একটি RecursionError যদি তোমার কাঠামো স্ব-রেফারেন্সিয়াল হয়।
  • allow_nan: if True, বিশেষ ভাসমান-বিন্দু মান যেমন NaN, Infinity, এবং -Infinity জাভাস্ক্রিপ্ট-সামঞ্জস্যপূর্ণ উপায়ে অনুমোদিত এবং এনকোড করা হয়েছে, যদিও স্পেসিফিকেশন অনুসারে এগুলি কঠোরভাবে বৈধ JSON নয়। যদি False, এই ধরনের মান এনকোড করার চেষ্টা করলে বৃদ্ধি পাবে ValueError.
  • indent: একটি অ-ঋণাত্মক পূর্ণসংখ্যা (অথবা একটি স্ট্রিং) যা সুন্দর মুদ্রণ নিয়ন্ত্রণ করে। একটি ধনাত্মক সংখ্যার অর্থ হল প্রতি নেস্টেড স্তরে অনেকগুলি স্থান। একটি স্ট্রিং (যেমন "\t") সরাসরি ইন্ডেন্টেশনের জন্য ব্যবহৃত হয়। None (ডিফল্ট) সবচেয়ে কমপ্যাক্ট উপস্থাপনা বেছে নেয়, প্রয়োজনের বাইরে কোনও অতিরিক্ত নতুন লাইন না থাকে।
  • separators: একটি টুপল (item_separator, key_separator) আইটেম এবং কী এবং মানের মধ্যে বিরামচিহ্ন এবং সাদা স্থান নিয়ন্ত্রণ করা। সবচেয়ে শক্ত JSON এর জন্য, আপনি সাধারণত ব্যবহার করেন (",", ":") সমস্ত ঐচ্ছিক স্থান বাদ দিতে।
  • default: এমন একটি ফাংশন যা এমন কোনও বস্তু গ্রহণ করে যা এনকোডার কীভাবে পরিচালনা করতে জানে না। এটিকে অবশ্যই একটি JSON-serializable প্রতিস্থাপন ফেরত দিতে হবে (যেমন a dict or list), অথবা বাড়ান TypeError। আপনার নিজস্ব ক্লাসগুলিকে সিরিয়ালাইজেবল করার জন্য এটিই প্রধান হুক।
  • sort_keys: if True, অভিধানগুলি কীগুলি সাজানোর মাধ্যমে এনকোড করা হয়। এটি রিগ্রেশন পরীক্ষা এবং পুনরুৎপাদনযোগ্য আউটপুটগুলির জন্য অত্যন্ত কার্যকর, যেখানে আপনি চান যে JSON ডাম্পগুলি রান জুড়ে স্থিতিশীল থাকুক।

একটি বাস্তব উদাহরণ হিসেবে, কল্পনা করুন আপনার কাছে একটি মিশ্র পাইথন তালিকা আছে পূর্ণসংখ্যা এবং একটি নাম, একটি আইডি এবং একটি ভাসমান-পয়েন্ট স্কোর সহ একটি অভিধান থাকবে। আপনি এভাবে JSON তৈরি এবং সংরক্ষণ করতে পারেন:

import pathlib
import json

path = pathlib.Path("myTextFile.json")
data =

with path.open(mode="wt") as f:
    json.dump(data, f)

print(json.dumps(data, indent=4))

মুদ্রিত JSON সুন্দরভাবে ফর্ম্যাট করা হবে ধন্যবাদ indent=4, প্রতিটি তালিকার আইটেম এবং অভিধান কী তার নিজস্ব লাইনে দেখানো হচ্ছে। এটি একটি একক, ঘন টেক্সট লাইনের তুলনায় ডিবাগিং এবং ম্যানুয়াল সম্পাদনাকে অনেক সহজ করে তোলে।

JSON কে আবার পাইথনে পার্স করা হচ্ছে

JSON টেক্সট থেকে পাইথন অবজেক্টে ফিরে যেতে, আপনি মিলিত ফাংশন জোড়া ব্যবহার করেন: json.load() (ফাইলের মতো বস্তুর জন্য) এবং json.loads() (JSON স্ট্রিং এর জন্য)। এই ফাংশনগুলি ইনপুট পার্স করে এবং আগের মতো একই ম্যাপিং টেবিল অনুসারে পাইথন টাইপগুলি পুনরায় তৈরি করে।

স্বাক্ষরগুলি মোটামুটি এইরকম দেখাচ্ছে: json.load(fp, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, kw) এবং json.loads(s, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, kw)। মৌলিক স্তরে, আপনি কেবল JSON ইনপুট দিয়ে তাদের কল করতে পারেন, তবে অতিরিক্ত আর্গুমেন্টগুলি আরও উন্নত পার্সিং আচরণের দরজা খুলে দেয়।

হুক মত object_hook এবং object_pairs_hook JSON অবজেক্টগুলিকে পাইথন স্ট্রাকচারে কীভাবে রূপান্তরিত করা হয় তা আপনাকে কাস্টমাইজ করতে দেয়, তোমাকে ডিকোড করা খাবার খাওয়ানোর মাধ্যমে dict অথবা একটি তালিকা (key, value) যথাক্রমে জোড়া। আপনি যদি JSON থেকে সরাসরি কাস্টম ক্লাস তৈরি করতে চান অথবা নির্দিষ্ট উপায়ে ক্রম সংরক্ষণ করতে চান তবে এটি কার্যকর।

অন্যান্য কলযোগ্য যেমন parse_float, parse_int, এবং parse_constant সংখ্যা এবং বিশেষ টোকেন কীভাবে ব্যাখ্যা করা হয় তা নিয়ন্ত্রণ করতে আপনাকে অনুমতি দেয়। উদাহরণস্বরূপ, আপনি ব্যবহার করতে চাইতে পারেন Decimal পরিবর্তে float আর্থিক মূল্যবোধের জন্য, অথবা রূপান্তরের জন্য "NaN", "inf", এবং "-inf" আপনার পছন্দের সেন্টিনেল বস্তুগুলিতে।

আগের উদাহরণটি অব্যাহত রেখে, আপনি যে JSON ফাইলটি লিখেছেন তা এভাবে পড়তে পারেন:

with path.open(mode="rt") as f:
    data = json.load(f)
print(data)

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

পাইথন কোন ধরণের ফাইলগুলিকে JSON-এ রূপান্তর করতে পারে?

প্রতিটি পাইথন অবজেক্টকে বাক্সের বাইরে JSON-এ রূপান্তর করা যায় না, তাই অনুমোদিত সেটটি মনে রাখা সহায়ক। ব্যবহারিক এনকোডারগুলি সাধারণ ধারক এবং স্কেলার প্রকারগুলিকে সমর্থন করে, প্লাস বুলিয়ান এবং None, এবং JSON প্রকারের ন্যূনতম সেটে সেগুলিকে ম্যাপ করুন।

ডিফল্টরূপে, আপনি নিম্নলিখিত পাইথন অবজেক্টগুলিকে নিরাপদে পাস করতে পারেন json.dumps():

  • dict (JSON অবজেক্ট হিসেবে এনকোড করা)
  • list এবং tuple (JSON অ্যারে হিসেবে এনকোড করা)
  • str (JSON স্ট্রিং হিসেবে এনকোড করা)
  • int এবং float (JSON নম্বর হিসেবে এনকোড করা)
  • True এবং False (এভাবে এনকোড করা হয়েছে true এবং false)
  • None (এভাবে এনকোড করা হয়েছে null)

যখন পাইথন এগুলো এনকোড করে, তখন JSON-এ ম্যাপিং করা সহজ হয়, এবং ডিকোডিং করার সময় এর বিপরীত। উদাহরণস্বরূপ, একটি পাইথন tuple একটি JSON অ্যারে হয়ে যায়, এবং আপনি একটি পাবেন list লোডে ফিরে যান। থেকে প্রাপ্ত Enums int or float সংখ্যা হিসেবেও এনকোড করা যেতে পারে।

অন্য সবকিছুর জন্য একটি কাস্টম প্রয়োজন default ক্রীড়াশিক্ষক (বস্তুগুলিকে একটি ধারাবাহিক উপস্থাপনায় রূপান্তর করতে) অথবা কারণ হবে TypeError। এটি ডিজাইন অনুসারে: JSON ডেটার জন্য তৈরি, আচরণ এবং পদ্ধতি সহ ইচ্ছামত বস্তুর গ্রাফের জন্য নয় যেমন আপনি ব্যবহার করে সিরিয়ালাইজ করতে পারেন pickle.

বেশিরভাগ দৈনন্দিন কাজের জন্য, এই ধরণের উপসেটটি বেশিরভাগ ব্যবহারের ক্ষেত্রেই প্রযোজ্য, যার মধ্যে রয়েছে API পেলোড, কনফিগারেশন ট্রি, ব্যবহারকারীর পছন্দ, মৌলিক লগ এবং প্রোটোটাইপ বা একক-ব্যবহারকারী সরঞ্জামের জন্য ছোট "ডাটাবেসের মতো" ফাইল।

সুন্দর মুদ্রণ, কম্প্যাক্ট আউটপুট, এবং অর্ডার করা কী

কাঁচা JSON আউটপুট সম্পূর্ণরূপে বৈধ কিন্তু পড়া কঠিন হতে থাকে, যেহেতু এটি প্রায়শই অপ্রয়োজনীয় ফাঁকা স্থান ছাড়াই তৈরি করা হয়। ডিবাগিং, লগিং বা অন্যান্য ডেভেলপারদের সাথে ভাগ করে নেওয়ার জন্য, আপনি প্রায়শই এক-লাইনারের পরিবর্তে পঠনযোগ্য, ইন্ডেন্টেড JSON চান।

সার্জারির indent এর পরামিতি json.dumps() সুন্দর মুদ্রণের জন্য প্রধান লিভার, আপনাকে পাইথনকে বলতে দেবে যে প্রতি ইন্ডেন্টেশন স্তরে কতগুলি স্পেস (অথবা কোন স্ট্রিং) ব্যবহার করতে হবে। একটি সাধারণ পছন্দ হল indent=4, যদিও কিছু কোডবেস দুটি স্পেস বা ট্যাব অক্ষর পছন্দ করে; প্রকল্পের মধ্যে স্টাইলিস্টিক কনভেনশন পরিবর্তিত হয়।

সার্জারির separators যুক্তি আপনাকে হোয়াইটস্পেস আরও সূক্ষ্ম করতে দেয়, টুপলের মতো দেওয়া (", ", ": ") ডিফল্টরূপে মানব-বান্ধব আউটপুটের জন্য। যদি আপনি সবচেয়ে কমপ্যাক্ট উপস্থাপনা চান - উদাহরণস্বরূপ নেটওয়ার্কে পেলোডের আকার ছাঁটাই করতে - আপনি সেট করতে পারেন separators=(",", ":") কমা এবং কোলনের পরে ফাঁকা স্থান মুছে ফেলার জন্য।

যখন আপনি ডিটারমিনিস্টিক আউটপুট সম্পর্কে চিন্তা করেন, উদাহরণস্বরূপ ইউনিট পরীক্ষা বা স্ন্যাপশট তুলনাতে, সক্রিয় sort_keys=True এনকোডারটি অভিধান কীগুলিকে সাজানো ক্রমে আউটপুট করে। এইভাবে, দুটি রান যা শব্দার্থগতভাবে অভিন্ন ডেটা তৈরি করে তা কেবল এই কারণে ভিন্ন হয় না যে অভিধানগুলি ভিন্ন ক্রমানুসারে আউটপুট কীগুলিতে ঘটেছে।

একসাথে, indent, separators, এবং sort_keys তোমাকে অনেক নিয়ন্ত্রণ দেই আপনার JSON মেশিনের জন্য অপ্টিমাইজ করা হয়েছে কিনা (কম্প্যাক্ট, কোন হোয়াইটস্পেস নেই) নাকি মানুষের জন্য (ইন্ডেন্ট করা, সারিবদ্ধ, রান জুড়ে একটি স্থিতিশীল আকৃতি সহ) তা নিয়ে।

নেস্টেড ডেটা, পার্সিং কৌশল এবং অ্যাক্সেস প্যাটার্ন

বাস্তব জগতের JSON-এ, ফ্ল্যাট স্ট্রাকচার ব্যতিক্রম; আপনি সাধারণত নেস্টেড অবজেক্ট এবং অ্যারে নিয়ে কাজ করবেন। একটি ই-কমার্স অ্যাপ্লিকেশনে একটি সাধারণ ব্যবহারকারীর রেকর্ডের কথা ভাবুন: ব্যক্তিগত তথ্য, নেস্টেড শিপিং ঠিকানা, নেস্টেড বিলিং বিবরণ এবং সম্ভবত অর্ডারের একটি তালিকা, যার প্রতিটি নিজস্বভাবে একটি জটিল কাঠামো।

পাইথনে JSON ডিকোড করার সময়, নেস্টেড ডেটা অভিধান এবং তালিকার সংমিশ্রণে পরিণত হয়, এবং আপনি স্ট্যান্ডার্ড ইনডেক্স এবং কী লুকআপ ব্যবহার করে এটি অ্যাক্সেস করতে পারেন। অগভীর কাঠামোর জন্য, এটি সহজ: data, data, এবং তাই।

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

হার্ডকোডেড কী দিয়ে আননেস্টেড (ফ্ল্যাট) JSON সরাসরি অ্যাক্সেস করা সহজ, যা ছোট ইউটিলিটিগুলির জন্য বা যখন আপনি সম্পূর্ণরূপে ইনপুট নিয়ন্ত্রণ করেন তখন পুরোপুরি ঠিক হতে পারে। তবে, বহিরাগত API ব্যবহার করার সময়, ছোট সহায়ক ফাংশনগুলি লেখা সাধারণ যা কাঠামোকে আবদ্ধ করে, তাই আপনি স্প্রে করবেন না আপনার কোডবেস জুড়ে চেইন।

গভীরতা যাই হোক না কেন, একই json.loads() আচরণ প্রযোজ্য: ফাংশনটি একটি JSON স্ট্রিং গ্রহণ করে এবং নেটিভ পাইথন টাইপ তৈরি করে যা আপনি নিয়মিত পাইথন টুল দিয়ে ম্যানিপুলেট করেন। স্বাভাবিকের বাইরে কোনও বিশেষ সিনট্যাক্সের প্রয়োজন নেই। dict এবং list সূচীকরণ।

JSON ফাইলগুলির সাথে কাজ করা: পড়া, লেখা এবং সংযোজন করা

JSON একটি আশ্চর্যজনকভাবে সহজ লাইটওয়েট স্টোরেজ ফর্ম্যাট তৈরি করে ছোট প্রকল্প, কনফিগারেশন ফাইল, অথবা স্ক্রিপ্টের জন্য যেখানে কিছু স্থায়ী অবস্থা বজায় রাখতে হয়। সরাসরি একটি সম্পূর্ণ ডাটাবেসের জন্য পৌঁছানোর পরিবর্তে, আপনি প্রায়শই বেশ কিছু সময়ের জন্য এক বা দুটি JSON ফাইল নিয়ে পালিয়ে যেতে পারেন।

একটি ফাইলে JSON লেখা সাধারণত দুই ধাপের প্রক্রিয়া: পাইথন ডেটা সিরিয়ালাইজ করুন json.dumps() অথবা সরাসরি json.dump(), এবং তারপর নিশ্চিত করুন যে ফলাফল স্ট্রিংটি ডিস্কে লেখা আছে। যদি আপনি কল করেন open('data.json', 'w'), আপনি লেখার মোডে একটি ফাইল হ্যান্ডেল পাবেন যা হয় ফাইলটি তৈরি করে অথবা যদি এটি ইতিমধ্যেই বিদ্যমান থাকে তবে এটিকে ছাঁটাই করে।

নেস্টেড স্ট্রাকচারের জন্য, প্রোটোকল ফ্ল্যাট ডেটা থেকে আলাদা নয়: তুমি এখনও একই ব্যবহার করো। json.dump() কল, এবং তালিকা এবং ডিক্টের নেস্টেড সংমিশ্রণগুলি পুনরাবৃত্তভাবে এনকোড করা হয়। আপনাকে সাধারণত যে সিদ্ধান্ত নিতে হয় তা হল পঠনযোগ্যতার জন্য আপনি ফাইলের আকারের তুলনায় কতটা ইন্ডেন্টেশন চান।

একটি ফাইল থেকে JSON পড়া বিপরীত: ফাইলটি টেক্সট মোডে খুলুন, ফাইল অবজেক্টটি এখানে পাস করুন json.load(), এবং আপনি আপনার পাইথন ডেটা স্ট্রাকচার ফিরে পাবেন। আবার, আচরণটি নেস্টিং কত গভীরে যায় তার উপর নির্ভর করে না - ডিকোডার আপনার জন্য সবকিছু পরিচালনা করে।

যদি আপনার বিদ্যমান ফাইলগুলিতে JSON ডেটা যুক্ত করার প্রয়োজন হয়, জিনিসগুলি আরও সূক্ষ্ম হয়ে ওঠে। JSON নিজেই "স্ট্রিমিং অ্যাপেন্ড" কে তুচ্ছভাবে সমর্থন করে না কারণ সম্পূর্ণ ফাইলটি বৈধ JSON হতে হবে। একটি সাধারণ প্যাটার্ন হল রেকর্ডের একটি অ্যারে সংরক্ষণ করা এবং সম্পূর্ণ অ্যারেটি পড়া/পরিবর্তন/লেখা, অথবা লাইন-ডিলিমিটেড JSON ব্যবহার করা যেখানে প্রতিটি লাইন একটি পৃথক JSON অবজেক্ট যা আপনি পূর্ববর্তী লাইনগুলি পুনর্লিখন না করেই যুক্ত করতে পারেন।

বাস্তব জগতে JSON: API, স্টোরেজ এবং ইন্টারচেঞ্জ

একবার আপনি আসল অ্যাপ্লিকেশন তৈরি শুরু করলে, JSON দ্রুত আঠালো হয়ে ওঠে যা ওয়েব ক্লায়েন্ট এবং সার্ভার, মাইক্রোসার্ভিসেস এবং তৃতীয় পক্ষের API গুলিকে সংযুক্ত করে। এটির মূল্য উভয়ই কারণ এটি কমপ্যাক্ট এবং মানুষ এখনও এটিকে যুক্তিসঙ্গতভাবে সহজেই পড়তে এবং সম্পাদনা করতে পারে।

API ইন্টারঅ্যাকশনে, JSON হল সবচেয়ে সাধারণ পেলোড ফর্ম্যাট, বিশেষ করে RESTful পরিষেবাগুলিতে। পাইথন অ্যাপ্লিকেশনগুলি সাধারণত লাইব্রেরি ব্যবহার করে যেমন requests HTTP অনুরোধ পাঠাতে এবং JSON প্রতিক্রিয়া গ্রহণ করুন, তারপর সেই প্রতিক্রিয়াগুলিকে বিশ্লেষণ করুন json.loads() অথবা সহায়ক পদ্ধতি ব্যবহার করে যা এটি মোড়ানো হয়।

JSON কনফিগারেশন ফাইল এবং লগের জন্যও একটি জনপ্রিয় ফর্ম্যাট, যেখানে এর কাঠামোগত, মূল-মান প্রকৃতি এটিকে প্লেইন টেক্সটের চেয়ে অনেক বেশি প্রকাশক করে তোলে এবং সম্পূর্ণ ডাটাবেসের তুলনায় সহজ থাকে। সিস্টেম উপাদানগুলি JSON এর মাধ্যমে কনফিগারেশন ভাগ করতে পারে এবং লগ অ্যাগ্রিগেটররা JSON লগগুলিকে আরও সহজে ফিল্টার বা বিশ্লেষণ করতে পার্স করতে পারে।

আরেকটি বড় ব্যবহারের উদাহরণ হল ডেটা স্ট্রাকচারের সিরিয়ালাইজেশন এবং ডিসিরিয়ালাইজেশন, মেমোরি সংগ্রহগুলিকে JSON স্ট্রিংয়ে রূপান্তর করা (সিরিয়ালাইজেশন) এবং পরে সেগুলি পুনর্গঠন করা (ডিসিরিয়ালাইজেশন)। এইভাবে আপনি ব্যবহারকারীর পছন্দগুলি সংরক্ষণ করেন, কাঠামোগত বার্তা প্রেরণ করুন কিউ-এর মাধ্যমে, অথবা পরিষেবা সীমানা জুড়ে নেস্টেড অবজেক্ট পাঠান, যদি আপনি JSON-সামঞ্জস্যপূর্ণ প্রকারগুলিতে লেগে থাকেন অথবা কাস্টম এনকোডার সরবরাহ করেন।

শুধুমাত্র JSON ছাড়াও, পাইথন কোডকে প্রায়শই JSON এবং অন্যান্য ফর্ম্যাটের মধ্যে রূপান্তর করতে হয়, যেমন XML, CSV, অথবা প্লেইন টেক্সট। উদাহরণস্বরূপ, আপনি একটি লিগ্যাসি সিস্টেম থেকে CSV পড়তে পারেন, এটিকে ডিক্টের তালিকায় রূপান্তর করতে পারেন এবং তারপর এটিকে একটি আধুনিক API-এর জন্য JSON হিসাবে ডাম্প করতে পারেন। অথবা আপনি একটি API থেকে JSON টেনে আনতে পারেন, এটিকে স্বাভাবিক করতে পারেন এবং বিশ্লেষকদের স্প্রেডশিটে লোড করার জন্য CSV লিখতে পারেন।

JSON-এ ফর্ম্যাটিং, ভ্যালিডেশন এবং অতিরিক্ত ক্রিয়াকলাপ

একবার আপনি মৌলিক পড়া এবং লেখার সাথে স্বাচ্ছন্দ্য বোধ করলে, আপনার কর্মপ্রবাহ উন্নত করার জন্য JSON ডেটাতে আপনি বেশ কিছু ছোট কিন্তু কার্যকর অপারেশন করতে পারেন: পঠনযোগ্যতার জন্য ফর্ম্যাটিং, নেস্টেড স্ট্রাকচার সমতল করা, একটি স্ট্রিং আসলে JSON কিনা তা যাচাই করা এবং সামঞ্জস্যপূর্ণ তুলনার জন্য ডেটা বাছাই করা।

প্রিটি-প্রিন্টিং এর সাথে json.dumps(..., indent=...) প্রথম ধাপ, আপনাকে সুন্দরভাবে ব্যবধানযুক্ত শ্রেণিবিন্যাস প্রদান করে যা এক নজরে কাঠামোগত সমস্যাগুলি সনাক্ত করা সহজ করে তোলে। এটি বিশেষ করে ডিবাগিং বা ডকুমেন্টেশনে উদাহরণ ভাগ করার সময় সহায়ক।

নেস্টেড JSON সমতলকরণ ডাউনস্ট্রিম প্রক্রিয়াকরণ এবং বিশ্লেষণকে সহজ করে তুলতে পারে, বিশেষ করে যদি আপনার ডেটা CSV-এর মতো ট্যাবুলার আকারে রূপান্তর করতে হয় অথবা এমন টুলগুলিতে ফিড করতে হয় যা গভীরভাবে নেস্টেড অবজেক্টের পরিবর্তে কী-মান জোড়া আশা করে। আপনি সাধারণত ডিক্ট এবং তালিকার উপর পুনরাবৃত্তি বা পুনরাবৃত্ত ট্র্যাভার্সাল ব্যবহার করে নিজেকে সমতলকরণ বাস্তবায়ন করেন।

JSON যাচাই করার জন্য প্রায়শই এটিকে বিশ্লেষণ করার চেষ্টা করা এবং ব্যতিক্রমগুলি ধরার মতো কাজ করতে হয়, বিশেষ করে যদি আপনি কেবল যাচাই করছেন যে একটি স্ট্রিং সিনট্যাক্টিকভাবে সঠিক। আরও কঠোর পরীক্ষার জন্য, আপনি JSON স্কিমা এবং বহিরাগত লাইব্রেরি ব্যবহার করতে পারেন, তবে অনেক ক্ষেত্রে একটি সহজ try/except কাছাকাছি json.loads() যথেষ্ট।

প্রতিক্রিয়া তুলনা করার সময় নির্দিষ্ট মান বা কী দ্বারা JSON ডেটা বাছাই করা সাহায্য করতে পারে, পরীক্ষার জন্য স্থিতিশীল স্ন্যাপশট তৈরি করা, অথবা কেবল নিশ্চিত করা যে অনুরূপ বস্তুগুলি একসাথে গোষ্ঠীভুক্ত করা হয়েছে। আপনি ডাম্প করার আগে অন্তর্নিহিত পাইথন তালিকা এবং নির্দেশাবলী সাজাতে পারেন অথবা নির্ভর করতে পারেন sort_keys=True যখন বস্তুর মধ্যে কী ক্রমবিন্যাসের উপর ফোকাস থাকে।

JSON এর সাথে কাজ করার সময় ত্রুটি পরিচালনা করা

এমনকি সুগঠিত সিস্টেমগুলিও ত্রুটিপূর্ণ JSON বা অপ্রত্যাশিত ডেটার মধ্যে চলে যেতে পারে, তাই JSON পার্সিং এবং এনকোডিং এর চারপাশে শক্তিশালী ত্রুটি পরিচালনা অত্যন্ত গুরুত্বপূর্ণ। পাইথন এই সমস্যাগুলি ব্যতিক্রমগুলির মাধ্যমে প্রকাশ করে এবং এগুলি মোকাবেলা করার মূর্খ উপায় হল অপারেশনগুলিকে মোড়ানো try...except ব্লক।

JSON ডিকোড করার সময়, সবচেয়ে সাধারণ সমস্যা হল অবৈধ সিনট্যাক্স, যেমন সম্পত্তির নামের চারপাশে উদ্ধৃতি চিহ্ন অনুপস্থিত থাকা অথবা পরবর্তী কমা। json মডিউলটি একটি ডিকোডিং ত্রুটি উত্থাপন করবে (সাধারণত json.JSONDecodeError), যা আপনি ধরতে এবং লগ করতে অথবা ব্যবহারকারী-বান্ধব বার্তায় রূপান্তর করতে পারেন।

উদাহরণস্বরূপ, একটি ভাঙা স্ট্রিং পার্স করার চেষ্টা করলে নিম্নলিখিত ত্রুটি দেখা দিতে পারে: Failed to decode JSON: Expecting property name enclosed in double quotes: line 1 column 29 (char 28)। এই ধরণের বার্তা আপনাকে কেবল পার্সিং ব্যর্থ হয়েছে তাই বলে না বরং পার্সার ইনপুটের কোথায় বিভ্রান্ত হয়েছে তাও বলে।

এনকোডিং এর দিকে, আপনি আঘাত করতে পারেন TypeError অসমর্থিত প্রকারগুলিকে সিরিয়ালাইজ করার চেষ্টা করার সময়, or ValueError যদি তুমি অনুমতি না দাও NaN এবং অসীমতার মাধ্যমে allow_nan=False কিন্তু আপনার ডেটাতে এই ধরনের মান রয়েছে। পাত্রে বৃত্তাকার রেফারেন্সগুলিও ট্রিগার করতে পারে RecursionError যদি আপনি সার্কুলার চেক অক্ষম করেন।

JSON অপারেশনগুলিকে ভুল I/O হিসেবে বিবেচনা করাই সর্বোত্তম অনুশীলন, বিশেষ করে যখন নেটওয়ার্ক সোর্স বা বহিরাগত ফাইল থেকে পড়া হয়: সর্বদা ধরে নিন যে কিছু ভুল হতে পারে এবং সেই অনুযায়ী ব্যতিক্রম ধরা পড়বে, সম্ভবত আপনার ডেটাতে আরও নির্দিষ্ট সীমাবদ্ধতা প্রয়োগের জন্য বৈধতা স্তর যোগ করা হবে। json.loads() অথবা API সহায়ক পদ্ধতিতে try...except ব্লক আপনার বাকি কোডকে ক্যাসকেডিং ব্যর্থতা থেকে রক্ষা করে এবং আপনাকে ফিরে আসতে দেয় ব্যবহারকারী-বান্ধব JSON ত্রুটি উপযুক্ত হলে ক্লায়েন্টদের কাছে।

পাইথনে ওয়েব এপিআই সহ JSON ব্যবহার করা

পাইথন থেকে আপনি যে বেশিরভাগ ওয়েব API-এর সাথে কথা বলেন, সেগুলি JSON পাঠাবে এবং গ্রহণ করবে, এবং সাধারণ ডেভেলপমেন্ট স্ট্যাক একত্রিত করে requests লাইব্রেরি (HTTP এর জন্য) এর সাথে json মডিউল (JSON পার্সিং এবং জেনারেট করার জন্য)। এই সমন্বয় API ইন্টিগ্রেশনকে খুবই স্বাভাবিক করে তোলে।

একটি সাধারণ প্যাটার্ন হল একটি API এন্ডপয়েন্ট কল করা, প্রতিক্রিয়া স্থিতি কোডটি সাফল্যের ইঙ্গিত দেয় কিনা তা পরীক্ষা করুন, এবং তারপর JSON বডি পার্স করুন। সেখান থেকে আপনি ক্ষেত্রগুলি অ্যাক্সেস করতে পারবেন, নেস্টেড ডেটা পরিচালনা করতে পারবেন এবং আপনার নিজস্ব ডোমেন মডেলগুলিতে প্রতিক্রিয়া ম্যাপ করতে পারবেন অথবা অবজেক্টগুলি দেখতে পারবেন।

নেটওয়ার্ক কল জড়িত থাকলে ত্রুটি পরিচালনা অতিরিক্ত গুরুত্বপূর্ণ হয়ে ওঠে, কারণ আপনি কেবল অবৈধ JSON-এর সম্মুখীন হতে পারেন না বরং টাইমআউট, সংযোগ ত্রুটি, অথবা সার্ভার-সাইড ব্যর্থতার সম্মুখীন হতে পারেন যা JSON-এর পরিবর্তে HTML দিয়ে প্রতিক্রিয়া জানায়। json.loads() অথবা API সহায়ক পদ্ধতিতে try...except ব্লক আপনার বাকি কোডকে ক্যাসকেডিং ব্যর্থতা থেকে রক্ষা করে।

একবার পার্স করা হলে, API JSON অন্য যেকোনো Python ডেটা স্ট্রাকচারের মতোই আচরণ করে, তাই আগে আলোচিত সমস্ত কৌশল - সুন্দর মুদ্রণ, সমতলকরণ, বৈধকরণ, বাছাই - সরাসরি প্রয়োগ করুন। পাইথন ডেটা এবং JSON এর মধ্যে স্বাচ্ছন্দ্য বোধ করা যখন আপনি একসাথে ওয়্যারিং পরিষেবা ব্যবহার করেন তখন একটি বিশাল উৎপাদনশীলতা বৃদ্ধি করে। যদি আপনি মনোযোগী হন বাস্তব অ্যাপ্লিকেশন তৈরি করা, JSON হ্যান্ডলিং প্যাটার্নগুলিতে আগে থেকেই মনোযোগ দিলে পরে ডিবাগিং সময় সাশ্রয় হবে।

পাইথনে JSON একটি একক ফাংশন কল সম্পর্কে কম এবং একটি টুলবক্স সম্পর্কে বেশি: স্পষ্ট টাইপ ম্যাপিং, নমনীয় এনকোডিং প্যারামিটার, কাস্টম টাইপের জন্য হুক, সহজ কিন্তু শক্তিশালী ফাইল I/O, এবং বাইরের বিশ্ব থেকে ডেটা পার্সিং, ফর্ম্যাটিং এবং যাচাই করার জন্য শক্তিশালী প্যাটার্ন, এই সবকিছুই JSON কে আধুনিক ডেটা-চালিত অ্যাপ্লিকেশনগুলির সাথে কাজ করা পাইথন প্রোগ্রামারদের জন্য একটি স্বাভাবিক ফিট করে তোলে।

সম্পর্কিত নিবন্ধ:
সমাধান করা হয়েছে: json পাইথন হিসাবে ওয়েবপৃষ্ঠা ডেটা পান
সম্পর্কিত পোস্ট: