কীভাবে JSON কে পাইথন অবজেক্টে রূপান্তর করবেন

কীভাবে JSON কে পাইথন অবজেক্টে রূপান্তর করবেন

পাইথনের json JSON ফরম্যাটে এনকোডিং এবং ডিকোডিং ডেটার জন্য লাইব্রেরির অনেক উপযোগিতা রয়েছে। বিশেষ করে, দ json.load() পদ্ধতি একটি ফাইল হিসাবে পড়া একটি JSON ডিকোড, এবং json.loads() একটি স্ট্রিং হিসাবে পড়া একটি JSON ডিকোড করুন। সাধারণভাবে, JSON ফাইলগুলি ডিকোড করার সময়, ডেটা পাইথন অভিধানে রূপান্তরিত হয়, তবে প্যারামিটার ব্যবহার করে এটি একটি কাস্টম অবজেক্টে রূপান্তর করা সম্ভব object_hook.

উদাহরণস্বরূপ, ধরুন আপনার কাছে নিম্নলিখিত JSON অবজেক্ট আছে:

json_obj = """{
  "name" : "Felipe",
  "email" : "[email protected]",
  "age" : 29
}"""

এবং নিম্নলিখিত ক্লাস:

class User():
  name : str
  email : str
  age : int
  def __init__(self, input):
      self.name = input.get("name")
      self.email = input.get("email")
      self.age = input.get("age")

আমরা যদি ডাকি json.loads() সঙ্গে User যেমন object_hook প্যারামিটার, the User.__init__() পদ্ধতি JSON এর সংশ্লিষ্ট সঙ্গে কল করা হবে dict ইনপুট হিসাবে।

import json

user = json.loads(json_obj, object_hook = User)
print(f"User {user.name}, age {user.age}, email {user.email}")
User Felipe, age 29, email [email protected]

কিন্তু যদি আপনার একটি নেস্টেড JSON থাকে?

json.loads() আসলে কল করে object_hook ফাংশন প্রতিবার এটি স্ট্রিং থেকে একটি সম্পূর্ণরূপে গঠিত JSON অবজেক্ট পড়ে। নিম্নলিখিত JSON বিবেচনা করুন, থেকে ফিরে এলোমেলো ব্যবহারকারী জেনারেটর API

json_obj = """{
            "gender": "male",
            "name": {
                "title": "Mr",
                "first": "Ian",
                "last": "Walters"
            },
            "location": {
                "street": {
                    "number": 3161,
                    "name": "Saddle Dr"
                },
                "city": "Bendigo",
                "state": "Western Australia",
                "country": "Australia",
                "postcode": 4285,
                "coordinates": {
                    "latitude": "-84.7903",
                    "longitude": "-29.1020"
                },
                "timezone": {
                    "offset": "+9:00",
                    "description": "Tokyo, Seoul, Osaka, Sapporo, Yakutsk"
                }
            },
            "email": "[email protected]",
            "login": {
                "uuid": "6ee5b2e8-01c3-4314-8f7f-80059f5dd9ec",
                "username": "lazyzebra585",
                "password": "walter",
                "salt": "afXmogsa",
                "md5": "a40e87023b57a4a60c7cb398584cbac3",
                "sha1": "74caf43400be38cce60a8da2e6d1c367246505c2",
                "sha256": "1becdf34bcc6704726c7e9b38821a5792f9dd0689d30789fb5e099a6e51e860a"
            },
            "dob": {
                "date": "1947-06-06T02:45:41.895Z",
                "age": 75
            },
            "registered": {
                "date": "2003-03-25T00:15:32.791Z",
                "age": 19
            },
            "phone": "06-9388-6976",
            "cell": "0469-101-424",
            "id": {
                "name": "TFN",
                "value": "561493929"
            },
            "picture": {
                "large": "https://randomuser.me/api/portraits/men/32.jpg",
                "medium": "https://randomuser.me/api/portraits/med/men/32.jpg",
                "thumbnail": "https://randomuser.me/api/portraits/thumb/men/32.jpg"
            },
            "nat": "AU"
        }"""

চলুন প্রতিটি ধাপে ডিকোড করা JSON প্রিন্ট করে দেখি কি হয়:

json.loads(json_obj, object_hook = print)
{'title': 'Mr', 'first': 'Ian', 'last': 'Walters'}
{'number': 3161, 'name': 'Saddle Dr'}
{'latitude': '-84.7903', 'longitude': '-29.1020'}
{'offset': '+9:00', 'description': 'Tokyo, Seoul, Osaka, Sapporo, Yakutsk'}
{'street': None, 'city': 'Bendigo', 'state': 'Western Australia', 'country': 'Australia', 'postcode': 4285, 'coordinates': None, 'timezone': None}
{'uuid': '6ee5b2e8-01c3-4314-8f7f-80059f5dd9ec', 'username': 'lazyzebra585', 'password': 'walter', 'salt': 'afXmogsa', 'md5': 'a40e87023b57a4a60c7cb398584cbac3', 'sha1': '74caf43400be38cce60a8da2e6d1c367246505c2', 'sha256': '1becdf34bcc6704726c7e9b38821a5792f9dd0689d30789fb5e099a6e51e860a'}
{'date': '1947-06-06T02:45:41.895Z', 'age': 75}
{'date': '2003-03-25T00:15:32.791Z', 'age': 19}
{'name': 'TFN', 'value': '561493929'}
{'large': 'https://randomuser.me/api/portraits/men/32.jpg', 'medium': 'https://randomuser.me/api/portraits/med/men/32.jpg', 'thumbnail': 'https://randomuser.me/api/portraits/thumb/men/32.jpg'}
{'gender': 'male', 'name': None, 'location': None, 'email': '[email protected]', 'login': None, 'dob': None, 'registered': None, 'phone': '06-9388-6976', 'cell': '0469-101-424', 'id': None, 'picture': None, 'nat': 'AU'}

So json.loads() কল object_hook ফাংশন প্রতিবার যখন এটি একটি সম্পূর্ণরূপে গঠিত JSON পড়ে, অর্থাৎ, প্রতিবার এটি একটি বন্ধনী জোড়া বন্ধ করে {}. তারপর, এটি ফলাফল ব্যবহার করে পুরো JSON অবজেক্ট তৈরি করে object_hook ফাংশন - নোট করুন None (এর রিটার্ন মান print) শেষ মুদ্রিত লাইনে।

আমরা এই সমস্যাটির জন্য দুটি কাজ দেখাব। প্রথম আমাদের পরিবর্তন করা হয় User.__init__() ইনপুটের ক্ষেত্রে আরও নমনীয় হওয়ার পদ্ধতি। আমরা এটি ব্যবহার করে এটি করব __dict__ বৈশিষ্ট্য প্রতিটি পাইথন অবজেক্ট আছে a __dict__ বৈশিষ্ট্য যা প্রতিটি বৈশিষ্ট্যের নাম এবং মান ধারণ করে। আমাদের পরিবর্তিত __init__() পদ্ধতি এই অভিধান আপডেট করবে:

class User():
  def __init__(self, input):
      self.__dict__.update(input)

user = json.loads(json_obj, object_hook = User)
print(f"User {user.name.first} {user.name.last}, age {user.dob.age}, email {user.email}")

সেরা-অভ্যাস, শিল্প-স্বীকৃত মান এবং অন্তর্ভুক্ত চিট শীট সহ গিট শেখার জন্য আমাদের হ্যান্ডস-অন, ব্যবহারিক গাইড দেখুন। গুগলিং গিট কমান্ড এবং আসলে বন্ধ করুন শেখা এটা!

User Ian Walters, age 75, email [email protected]

আরেকটি সম্ভাব্য কাজ হল ব্যবহার করা collections.namedtuple শ্রেণী:

from collections import namedtuple

def create_user(input):
    User = namedtuple('User', input.keys())
    return User(**input)
    
user = json.loads(json_obj, object_hook=create_user)
print(f"User {user.name.first} {user.name.last}, age {user.dob.age}, email {user.email}")
User Ian Walters, age 75, email [email protected]

কোথায় namedtuple('User', input.keys()) নামে একটি টিপল সাবক্লাস তৈরি করে User বৈশিষ্ট্যের নাম হিসাবে ইনপুট এর কী সহ, এবং User(**input) গুণাবলীর জন্য সংশ্লিষ্ট মান নির্ধারণ করে।

সময় স্ট্যাম্প:

থেকে আরো Stackabuse