خانه / آموزش‌ها / آموزش کار با JSON در پایتون

آموزش کار با JSON در پایتون

🐍 HomeOfPython
|
📅 1404/10/18

سطح مقدماتی (Beginner Level)

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

در این سطح یاد می‌گیریم چطور داده‌ها را بین فرمت پایتون و رشته‌های متنی JSON جابجا کنیم و چگونه با فایل‌های .json کار کنیم.

۱. تبدیل پایتون به JSON (Serialization)

برای تبدیل یک شیء پایتونی (مثل دیکشنری یا لیست) به یک رشته‌ی متنی با فرمت JSON، از متد json.dumps() استفاده می‌کنیم. به این فرآیند Serialization یا Encoding می‌گویند.

جدول تبدیل نوع داده‌ها به صورت زیر است:

  • dict $\rightarrow$ Object
  • list/tuple $\rightarrow$ Array
  • str $\rightarrow$ String
  • int/float $\rightarrow$ Number
  • True/False $\rightarrow$ true/false
  • None $\rightarrow$ null

مثال اول: تبدیل دیکشنری ساده

در این مثال یک دیکشنری ساده پایتون را به رشته JSON تبدیل می‌کنیم.

Python

مثال دوم: تبدیل لیست و انواع داده‌های مختلف

در اینجا لیستی شامل مقادیر None و اعداد اعشاری را تبدیل می‌کنیم تا ببینیم در JSON چگونه نمایش داده می‌شوند.

Python

۲. تبدیل JSON به پایتون (Deserialization)

برای تبدیل یک رشته‌ی JSON (که معمولاً از وب یا فایل دریافت شده) به شیء پایتونی، از متد json.loads() استفاده می‌کنیم.

مثال اول: تبدیل رشته به دیکشنری

Python

مثال دوم: مدیریت آرایه‌های JSON

آرایه‌های JSON در پایتون به list تبدیل می‌شوند.

Python

۳. کار با فایل‌های JSON

علاوه بر کار با رشته‌ها (dumps و loads)، ما توابع dump و load (بدون s) را داریم که مستقیماً با فایل‌ها کار می‌کنند.

مثال اول: نوشتن در فایل (json.dump)

Python

مثال دوم: خواندن از فایل (json.load)

Python

سطح پیشرفته (Professional Level)

در پروژه‌های واقعی، صرفاً تبدیل داده‌ها کافی نیست. ما نیاز به فرمت‌دهی زیبا، مدیریت انکودینگ زبان فارسی، و سریال‌سازی اشیاء پیچیده (مثل کلاس‌های سفارشی) داریم.

چرخه تبدیل JSON

۱. فرمت‌دهی و زبان فارسی

به صورت پیش‌فرض json.dumps کاراکترهای غیر ASCII (مثل فارسی) را به کد یونی‌کد (مثلاً \u0633) تبدیل می‌کند. همچنین خروجی آن فشرده و در یک خط است.

برای حل این مشکلات از پارامترهای زیر استفاده می‌کنیم:

  1. ensure_ascii=False: برای نمایش صحیح حروف فارسی.
  2. indent=4: برای توگذاری و خوانایی کد.
  3. sort_keys=True: برای مرتب‌سازی کلیدها بر اساس حروف الفبا.

مثال: ایجاد JSON خوانا و فارسی

Python

۲. سریال‌سازی اشیاء سفارشی (Custom Objects)

ماژول json به طور پیش‌فرض نمی‌داند چگونه یک آبجکت از کلاس (Class) شما را تبدیل کند و خطای TypeError می‌دهد. برای حل این مشکل دو راه داریم.

راه حل اول: استفاده از پارامتر default

می‌توانیم یک تابع بنویسیم که آبجکت را گرفته و آن را به فرمت دیکشنری برگرداند.

python
# Static: تعریف کلاس و تابع کمکی
class User:
    def __init__(self, name, age):
        self.name = name
        self.age = age

def encode_user(obj):
    if isinstance(obj, User):
        return {"name": obj.name, "age": obj.age, "__type__": "User"}
    raise TypeError(f"Object of type {type(obj)} is not JSON serializable")
Python

راه حل دوم: ارث‌بری از JSONEncoder

روشی حرفه‌ای‌تر برای پروژه‌های بزرگ، ساختن کلاس Encoder اختصاصی است.

Python

۳. دیکد کردن سفارشی (object_hook)

هنگام تبدیل JSON به پایتون، اگر بخواهیم داده‌ها مستقیماً به یک کلاس تبدیل شوند (نه دیکشنری)، از object_hook استفاده می‌کنیم.

Python