✍️ فایل متنی ممکن است وجود داشته باشد اما محتوایش 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":}' ناموفقاند. همه نمونهها در همان فراخوانی ساخته شوند و هیچ فایل کاربر لازم نباشد.