حالت آفلاین — محتوا از حافظهٔ کش نمایش داده می‌شود
آموزش کار با فایل در پایتون؛ CSV، JSON و گزارش‌گیری

ساخت JSON خوانای فارسی با dumps و loads در پایتون

JSON در پایتون؛ تبدیل داده و ذخیره گزارش فارسی · 0٪

✍️ یک راه ساده برای بررسی درست بودن تبدیل، رفت‌وبرگشت است: داده را به متن JSON تبدیل کن و سپس همان متن را بخوان. اگر داده از نوع‌های پشتیبانی‌شده JSON باشد، نتیجه خواندن باید همان ساختار اولیه را بدهد. اینجا کلیدهای دیکشنری رشته‌اند و عددها صحیح‌اند تا تبدیل نوع غیرمنتظره نداشته باشیم.

مثلاً {'کالا':'مداد','تعداد':2} به متن JSON با فارسی خوانا تبدیل می‌شود و بعد دوباره یک دیکشنری با همان دو مقدار می‌دهد. برای خروجی تکرارپذیر، کلیدها را با sort_keys=True مرتب می‌کنیم؛ این ترتیب صرفاً برای نمایش ثابت است، نه رتبه‌بندی معنایی داده.

تابع ناقص باید هم متن تولیدشده و هم داده بازخوانی‌شده را تحویل بدهد. قالب جداکننده‌ها همان پیش‌فرض json.dumps می‌ماند؛ فاصله‌های دلخواه اضافه نکن. خطای رایج، باقی گذاشتن ensure_ascii در حالت پیش‌فرض یا استفاده از eval برای خواندن متن است؛ json.loads دقیقاً ابزار همین قالب است. فهرست خالی، None و ساختارهای تو در تو هم داده JSON مجازند. در این گام رشته در حافظه است؛ نوشتن فایل را در درس بعد انجام می‌دهیم.

تابع آماده course_check از ورودی کپی عمیق می‌گیرد، تابع اصلی را اجرا می‌کند و تغییر ورودی را رد می‌کند؛ آن را نگه دار و فقط تابع اصلی را کامل کن.

فعالیت شما

تابع json_snapshot(data) داده JSON‌پذیر با کلیدهای رشته‌ای و عددهای صحیح می‌گیرد؛ text=json.dumps(data,ensure_ascii=False,sort_keys=True) با جداکننده‌های پیش‌فرض بساز، سپس loads همان text را اجرا کن و {'text':text,'decoded':نتیجه} بده. None و فهرست/دیکشنری خالی و داده تو در تو مجازند؛ ورودی تغییر نکند. برای {'نام':'سارا'} متن دقیق '{"نام": "سارا"}' است. course_check آماده را نگه دار؛ این تابع تغییر ورودی را رد و همان خروجی اصلی را برمی‌گرداند.

مطالعهٔ این گام برای همه آزاد است

برای پاسخ‌دادن، بررسی پاسخ، ثبت پیشرفت و استفاده از دستیار باید شرایط شرکت در فعالیت‌ها را داشته باشید.

برای انجام فعالیت وارد شوید

برای انجام فعالیت‌ها ابتدا این دوره‌های پیش‌نیاز را تکمیل کنید:

کد اولیهٔ فعالیت

import json
def json_snapshot(data):
    # TODO: serialize with readable Unicode, then parse the same text
    text = ''
    return {'text': text, 'decoded': None}


def course_check(*args):
    from copy import deepcopy
    before = deepcopy(args)
    result = json_snapshot(*args)
    if args != before:
        raise AssertionError("ورودی نباید تغییر کند.")
    return result