🐍 کتابخانه مرجع پایتون

📄 کار با JSON در پایتون

JSON (JavaScript Object Notation) یک فرمت سبک برای تبادل داده است که هم برای انسان خوانا و هم برای ماشین قابل پردازش است. پایتون با ماژول json امکانات کاملی برای تبدیل داده‌های پایتون به JSON (سریال‌سازی) و تبدیل JSON به داده‌های پایتون (دیسریال‌سازی) فراهم می‌کند.

کاربردها: ذخیره‌سازی داده، ارتباط با APIها، تنظیمات برنامه، و تبادل داده بین سیستم‌ها.

🔹 ساختار JSON

نوع JSON نوع پایتون مثال JSON
object dict {"name": "Saba"}
array list ["a", "b", "c"]
string str "hello"
number int / float 42, 3.14
boolean bool true / false
null None null

🔹 تبدیل پایتون به JSON با json.dumps()

import json

# داده پایتون
data = {
    "name": "Saba",
    "age": 28,
    "is_student": False,
    "courses": ["Python", "Data Science", "AI"],
    "address": {
        "city": "Tehran",
        "zip": "12345"
    },
    "grades": None
}

# تبدیل به JSON
json_string = json.dumps(data)
print("JSON string:")
print(json_string)

# JSON با فرمت زیبا (indent)
json_pretty = json.dumps(data, indent=4)
print("\nPretty JSON:")
print(json_pretty)
⏳ برای اجرا دکمه را بزنید...

🔹 تبدیل JSON به پایتون با json.loads()

import json

# داده JSON (رشته)
json_string = """
{
    "name": "Saba",
    "age": 28,
    "is_student": false,
    "courses": ["Python", "Data Science", "AI"]
}
"""

# تبدیل به پایتون
data = json.loads(json_string)

print("Python data:")
print(f"Name: {data['name']}")
print(f"Age: {data['age']}")
print(f"Is student: {data['is_student']}")
print(f"Courses: {', '.join(data['courses'])}")
⏳ برای اجرا دکمه را بزنید...

🔹 خواندن و نوشتن فایل JSON

import json

# نوشتن در فایل JSON (dump)
data = {
    "name": "Saba",
    "age": 28,
    "skills": ["Python", "AI", "Data Science"]
}

with open("person.json", "w") as file:
    json.dump(data, file, indent=4)
print("Data written to person.json")

# خواندن از فایل JSON (load)
with open("person.json", "r") as file:
    loaded_data = json.load(file)
print("\nData loaded from file:")
print(loaded_data)

# نمایش با فرمت زیبا
print("\nPretty print:")
print(json.dumps(loaded_data, indent=2))
⏳ برای اجرا دکمه را بزنید...

🔹 سفارشی‌سازی با پارامترها

import json

data = {
    "name": "Saba",
    "age": 28,
    "is_active": True,
    "scores": [18.5, 19.0, 17.5]
}

# sort_keys: مرتب‌سازی کلیدها
sorted_json = json.dumps(data, sort_keys=True, indent=2)
print("Sorted keys:")
print(sorted_json)

# separators: حذف فاصله‌های اضافی
compact_json = json.dumps(data, separators=(",", ":"))
print("\nCompact JSON:")
print(compact_json)

# ensure_ascii: پشتیبانی از کاراکترهای غیرASCII
persian_data = {"name": "سارا", "city": "تهران"}
ascii_json = json.dumps(persian_data, ensure_ascii=False)
print("\nPersian characters (ensure_ascii=False):")
print(ascii_json)

# skipkeys: نادیده گرفتن کلیدهای غیرمعتبر
invalid_data = {1: "one", 2: "two", "three": 3}
try:
    json.dumps(invalid_data)
except TypeError as e:
    print(f"\nError: {e}")

# با skipkeys (نادیده گرفتن کلیدهای غیررشته‌ای)
result = json.dumps(invalid_data, skipkeys=True)
print(f"With skipkeys: {result}")
⏳ برای اجرا دکمه را بزنید...

🔹 مدیریت خطا در JSON

import json

# JSON نامعتبر
invalid_json = '{"name": "Saba", "age": 28,}'  # کامای اضافی

try:
    data = json.loads(invalid_json)
except json.JSONDecodeError as e:
    print(f"JSON Decode Error: {e}")

# داده پایتون با کلید غیررشته‌ای
invalid_data = {1: "one", 2: "two"}

try:
    json.dumps(invalid_data)
except TypeError as e:
    print(f"Type Error: {e}")

# مدیریت با skipkeys
result = json.dumps(invalid_data, skipkeys=True)
print(f"Result with skipkeys: {result}")
⏳ برای اجرا دکمه را بزنید...

🔹 کار با کلاس‌های سفارشی

import json

class Person:
    def __init__(self, name, age, city):
        self.name = name
        self.age = age
        self.city = city

# تابع تبدیل به دیکشنری
def person_to_dict(obj):
    if isinstance(obj, Person):
        return {
            "name": obj.name,
            "age": obj.age,
            "city": obj.city,
            "type": "Person"
        }
    raise TypeError(f"Object of type {type(obj)} is not JSON serializable")

# تابع تبدیل از دیکشنری به شیء
def dict_to_person(obj):
    if "type" in obj and obj["type"] == "Person":
        return Person(obj["name"], obj["age"], obj["city"])
    return obj

# استفاده
person = Person("Saba", 28, "Tehran")

# تبدیل به JSON با default
person_json = json.dumps(person, default=person_to_dict, indent=2)
print("Person as JSON:")
print(person_json)

# تبدیل JSON به شیء با object_hook
json_string = '{"name": "Ali", "age": 30, "city": "Shiraz", "type": "Person"}'
person_obj = json.loads(json_string, object_hook=dict_to_person)
print(f"\nPerson object:")
print(f"Name: {person_obj.name}")
print(f"Age: {person_obj.age}")
print(f"City: {person_obj.city}")
⏳ برای اجرا دکمه را بزنید...

🔹 نمونه JSON پیچیده

import json

# داده پیچیده: لیستی از دانشجویان با نمرات
complex_data = {
    "university": "Tehran University",
    "semester": "Fall 2024",
    "students": [
        {
            "name": "Saba",
            "age": 22,
            "courses": [
                {"name": "Math", "score": 18.5},
                {"name": "Physics", "score": 19.0},
                {"name": "CS", "score": 17.5}
            ]
        },
        {
            "name": "Ali",
            "age": 24,
            "courses": [
                {"name": "Math", "score": 15.0},
                {"name": "Physics", "score": 14.5},
                {"name": "CS", "score": 16.0}
            ]
        }
    ]
}

# تبدیل به JSON با فرمت زیبا
json_str = json.dumps(complex_data, indent=2)
print("Complex JSON:")
print(json_str)

# بارگذاری مجدد
loaded_data = json.loads(json_str)

# محاسبه میانگین نمرات هر دانشجو
for student in loaded_data["students"]:
    scores = [course["score"] for course in student["courses"]]
    avg = sum(scores) / len(scores)
    print(f"{student['name']} average: {avg:.2f}")
⏳ برای اجرا دکمه را بزنید...

🔹 کار با JSON در API (نمونه)

import json
import requests

# دریافت داده از یک API (مثال فرضی)
# response = requests.get("https://api.example.com/users")
# data = response.json()

# شبیه‌سازی داده JSON
api_response = """
{
    "status": "success",
    "data": {
        "users": [
            {"id": 1, "name": "Saba", "email": "[email protected]"},
            {"id": 2, "name": "Ali", "email": "[email protected]"}
        ]
    }
}
"""

data = json.loads(api_response)

# پردازش داده
if data["status"] == "success":
    users = data["data"]["users"]
    for user in users:
        print(f"User {user['id']}: {user['name']} ({user['email']})")

🔹 مثال جامع: سیستم ذخیره‌سازی پیکربندی

import json
import os

class ConfigManager:
    def __init__(self, filename="config.json"):
        self.filename = filename
        self.config = self.load_config()

    def load_config(self):
        """بارگذاری پیکربندی از فایل JSON"""
        if os.path.exists(self.filename):
            with open(self.filename, "r") as file:
                return json.load(file)
        return {
            "app_name": "MyApp",
            "version": "1.0.0",
            "debug": False,
            "database": {
                "host": "localhost",
                "port": 5432,
                "user": "admin",
                "password": "secret"
            },
            "features": {
                "dark_mode": True,
                "notifications": True
            }
        }

    def save_config(self):
        """ذخیره پیکربندی در فایل JSON"""
        with open(self.filename, "w") as file:
            json.dump(self.config, file, indent=4)
        print(f"Config saved to {self.filename}")

    def get(self, key, default=None):
        """دریافت مقدار از پیکربندی"""
        keys = key.split(".")
        value = self.config
        for k in keys:
            if isinstance(value, dict) and k in value:
                value = value[k]
            else:
                return default
        return value

    def set(self, key, value):
        """تنظیم مقدار در پیکربندی"""
        keys = key.split(".")
        config = self.config
        for k in keys[:-1]:
            if k not in config or not isinstance(config[k], dict):
                config[k] = {}
            config = config[k]
        config[keys[-1]] = value
        self.save_config()

    def show_config(self):
        """نمایش پیکربندی به صورت JSON"""
        print(json.dumps(self.config, indent=2))

# استفاده
config_mgr = ConfigManager("app_config.json")

# نمایش پیکربندی
print("Current configuration:")
config_mgr.show_config()

# دریافت مقادیر
print(f"\nApp name: {config_mgr.get('app_name')}")
print(f"Debug mode: {config_mgr.get('debug')}")
print(f"Database host: {config_mgr.get('database.host')}")
print(f"Dark mode: {config_mgr.get('features.dark_mode')}")

# تغییر مقادیر
config_mgr.set("debug", True)
config_mgr.set("database.password", "new_password")
config_mgr.set("features.dark_mode", False)

print("\nUpdated configuration:")
config_mgr.show_config()
⏳ برای اجرا دکمه را بزنید...

📌 نکات کلیدی

← قبلی: تاریخ و زمان → بعدی: کار با CSV ↑ بازگشت به فهرست متوسط