কম্পিউটার টিউটোরিয়াল

পাইথনে JSON এনকোডার ও ডিকোডার প্যাকেজ

JSON মানে JavaScript Object Notation। এটি একটি লাইটওয়েট ডেটা ইন্টারচেঞ্জ ফরম্যাট। এটি পিকলের মতোই। তবে পিকল সিরিয়ালাইজেশন পাইথন-নির্দিষ্ট, কিন্তু JSON ফরম্যাট অনেক ভাষায় ইমপ্লিমেন্ট করা থাকে। পাইথনের স্ট্যান্ডার্ড লাইব্রেরির json মডিউল অবজেক্ট সিরিয়ালাইজেশন কার্যকারিতা বাস্তবায়ন করে যা পিকল ও marshal মডিউলের সদৃশ।

পিকল মডিউলের মতোই json মডিউলও ডেটা সিরিয়ালাইজেশনের জন্য dumps() ও loads() ফাংশন এবং ফাইলে লেখা/পড়ার জন্য dump() ও load() ফাংশন প্রদান করে।

dumps() ফাংশন

এই ফাংশনটি অবজেক্টকে JSON ফরম্যাটে রূপান্তর করে।

loads() ফাংশন

এই ফাংশনটি একটি JSON স্ট্রিংকে পাইথন অবজেক্টে রূপান্তর করে।

নিচের উদাহরণটি এই ফাংশনগুলোর বেসিক ব্যবহার দেখায়:

>>> import json
>>> data = ['Rakesh', {'marks': (50, 60, 70)}]
>>> s = json.dumps(data)
>>> s
'["Rakesh", {"marks": [50, 60, 70]}]'
>>> json.loads(s)
['Rakesh', {'marks': [50, 60, 70]}]

dumps() ফাংশনটি অপশনাল sort_keys আর্গুমেন্ট নেয়। ডিফল্টভাবে এটি False। True সেট করলে JSON স্ট্রিং-এ ডিকশনারির কীগুলো সর্টেড অর্ডারে থাকে।

>>> data = {"marks": 50, "age": 20, "rank": 5}
>>> s = json.dumps(data, sort_keys=True)
>>> s
'{"age": 20, "marks": 50, "rank": 5}'
>>> json.loads(s)
{'age': 20, 'marks': 50, 'rank': 5}

dumps() ফাংশনটির আরেকটি অপশনাল প্যারামিটার আছে indent যা একটি সংখ্যা মান নেয়। এটি JSON স্ট্রিং-এর ফরম্যাটেড রিপ্রেজেন্টেশনের প্রতিটি সেগমেন্টের দৈর্ঘ্য নির্ধারণ করে, pprint আউটপুটের মতো।

>>> data = ['Rakesh', {'marks': (50, 60, 70)}]
>>> s = json.dumps(data, indent=2)
>>> print(s)
[
  "Rakesh",
  {
    "marks": [
      50,
      60,
      70
    ]
  }
]

json মডিউলে উপরের ফাংশনগুলোর সাথে মিলে যাওয়া অবজেক্ট-ওরিয়েন্টেড APIও রয়েছে। মডিউলে দুটি ক্লাস সংজ্ঞায়িত: JSONEncoder ও JSONDecoder।

JSONEncoder ক্লাস

এই ক্লাসের অবজেক্ট পাইথন ডেটা স্ট্রাকচার এর জন্য এনকোডার। প্রতিটি পাইথন ডেটা টাইপ সংশ্লিষ্ট JSON টাইপে রূপান্তরিত হয় নিচের টেবিল অনুযায়ী:

পাইথন JSON
dict object
list, tuple array
str string
int, float, int- & float-derived Enums number
True true
False false
None null

JSONEncoder ক্লাস JSONEncoder() কনস্ট্রাক্টর দিয়ে ইনস্ট্যানসিয়েট করা হয়। এনকোডার ক্লাসে নিচের গুরুত্বপূর্ণ মেথডগুলো সংজ্ঞায়িত:

  • encode() − পাইথন অবজেক্টকে JSON ফরম্যাটে সিরিয়ালাইজ করে।

  • iterencode() − অবজেক্টটি এনকোড করে এবং অবজেক্টের প্রতিটি আইটেমের এনকোডেড ফর্ম দিয়ে একটি ইটেরেটর ফেরত দেয়।

  • indent − এনকোডেড স্ট্রিং-এর ইনডেন্ট লেভেল নির্ধারণ করে।

  • sort_keys − true বা false, কীগুলো সর্টেড অর্ডারে আসবে কিনা তা নির্ধারণ করে।

  • check_circular − True হলে কন্টেইনার টাইপ অবজেক্টে সার্কুলার রেফারেন্স চেক করে।

নিচের উদাহরণটি পাইথন লিস্ট অবজেক্ট এনকোড করে:

>>> e = json.JSONEncoder()
>>> e.encode(data)
'["Rakesh", {"marks": [50, 60, 70]}]'

iterencode() মেথড ব্যবহার করে এনকোডেড স্ট্রিং-এর প্রতিটি অংশ নিচের মত প্রদর্শিত হয়:

>>> for obj in e.iterencode(data):
...     print(obj)
[
  "Rakesh"
  {
    "marks"
    :
    [
      50
      , 60
      , 70
    ]
  }
]

JSONDecoder ক্লাস

এই ক্লাসের অবজেক্ট JSON স্ট্রিংকে পাইথন ডেটা স্ট্রাকচার에 ডিকোড করতে সাহায্য করে। এই ক্লাসের প্রধান মেথড হলো decode()। নিচের উদাহরণ কোডটি আগের ধাপে এনকোডেড স্ট্রিং থেকে পাইথন লিস্ট অবজেক্ট পুনরুদ্ধার করে:

>>> d = json.JSONDecoder()
>>> d.decode(s)
['Rakesh', {'marks': [50, 60, 70]}]

ফাইল/স্ট্রিমের সাথে JSON

json মডিউল load() ও dump() ফাংশন সংজ্ঞায়িত করে যা JSON ডেটা ফাইল-সদৃশ অবজেক্টে (যা ডিস্ক ফাইল বা বাইট স্ট্রিম হতে পারে) লিখে এবং সেখান থেকে ডেটা পড়ে।

dump() ফাংশন

এই ফাংশনটি পাইথন অবজেক্ট ডেটাকে JSON ফরম্যাটে এনকোড করে একটি ফাইলে লিখে। ফাইলের লিখার অনুমতি থাকতে হবে।

>>> data = ['Rakesh', {'marks': (50, 60, 70)}]
>>> fp = open('json.txt', 'w')
>>> json.dump(data, fp)
>>> fp.close()

এই কোড করেন্ট ডিরেক্টরিতে 'json.txt' তৈরি করবে। এর কন্টেন্ট হবে:

["Rakesh", {"marks": [50, 60, 70]}]

load() ফাংশন

এই ফাংশনটি ফাইল থেকে JSON ডেটা লোড করে এবং সেটা থেকে পাইথন অবজেক্ট গঠন করে। ফাইলটি পড়ার অনুমতিতে খোলা থাকতে হবে।

>>> fp = open('json.txt', 'r')
>>> ret = json.load(fp)
>>> ret
['Rakesh', {'marks': [50, 60, 70]}]
>>> fp.close()

এই আর্টিকেলে json মডিউলের গুরুত্বপূর্ণ ফাংশনগুলো কভার করা হয়েছে।

  1. পাইথন কোড প্যাকেজিং ও পাবলিশিং (Packaging and Publishing Python Code)

  2. পাইথনে __str__ এবং __repr__ এর পার্থক্য কী?

  3. পাইথন ডিকশনারিকে JSON ফরম্যাটে প্রিন্ট করার পদ্ধতি

  4. পাইথন ফাংশন থেকে JSON অবজেক্ট রিটার্ন করা