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

مدیریت JSON خراب با JSONDecodeError در پایتون

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

✍️ فایل متنی ممکن است وجود داشته باشد اما محتوایش JSON معتبر نباشد. نبود فایل و خراب بودن قالب دو مسئله متفاوت‌اند. در این فعالیت فایل همیشه از آرگومان ساخته می‌شود؛ بنابراین فقط صحت قالب JSON را می‌سنجیم. اگر parse شکست خورد، به جای توقف گزارش‌گیر یک نتیجه مشخص برمی‌گردانیم.

مثلاً متن '{"count":2}' موفق است، ولی '{"count":}' مقدار ندارد و JSONDecodeError می‌دهد. متن 'null' هم JSON معتبر است و به None تبدیل می‌شود؛ پس نمی‌توانیم با خالی بودن مقدار data درباره موفقیت تصمیم بگیریم. یک پرچم ok جدا این ابهام را برطرف می‌کند.

تابع را مستقل بنویس: متن خام را داخل فایل UTF-8 ذخیره کن، سپس json.load را در try اجرا کن. فقط json.JSONDecodeError را بگیر. خطای رایج، استفاده از except بدون نام یا True اعلام کردن هر فایل غیرخالی است؛ یک متن طولانی هم می‌تواند قالب خراب داشته باشد. برای متن خالی شکست قالب داریم، ولی دیکشنری خالی {} موفق است. نتیجه باید همیشه دو کلید ok و data داشته باشد تا شکل پاسخ برای مصرف‌کننده ثابت بماند.

فعالیت شما

تابع safe_json_file(text) رشته خام را در فایل موقت UTF-8 بنویسد و با json.load بخواند. در موفقیت {'ok':True,'data':مقدار خوانده‌شده} و فقط در JSONDecodeError {'ok':False,'data':None} بده. 'null' موفق با data=None است؛ متن خالی یا '{"x":}' ناموفق‌اند. همه نمونه‌ها در همان فراخوانی ساخته شوند و هیچ فایل کاربر لازم نباشد.

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

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

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

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

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

import tempfile
from pathlib import Path
import json

def safe_json_file(text):
    # TODO: write the raw fixture and distinguish valid JSON from decode errors
    pass