JSON که کوتاه شده JavaScript Object Notation  است، فرمت استاندارد و مستقل از پلتفرم و یا زبان برنامه نویسی است که از آن برای تبادل اطلاعات (Information Exchange) میان سیستم های مختلف و مستقل از یکدیگر استفاده می شود. در این نوشته آموزش می دهیم که چگونه فایل های json که روی سیستم یا روی شبکه وجود دارند را بخوانیم و همچنین چگونه فایل های json را ایجاد کنیم.

در نوشته پسین نمونه ای را خواهیم گفت که با خواندن داده های به فرمت json داده های هواشناسی و وضعیت آب و هوا را بدست می آوریم. در پایتون ماژول استانداردی به نام json وجود دارد که تمامی نیازهای خواندن و ایجاد کردن فرمت json را پوشش می دهد. همچنین می توانید از کتابخانه Pandas نیز برای خواندن و نوشتن فرمت JSON کمک بگیرید.

در کد زیر نمونه ساده ای از داده های به فرمت json را نشان می دهد که متشکل از چندین جفت کلید و مقدار است که میان آکولادهای باز و بسته شده قرار دارند. برای شروع لطفا کد زیر را در یک فایل با پسوند json ذخیره کنید تا در ادامه این فایل را خوانده و پردازش کنیم.

ایجاد محتوای json از روی دیکشنری های پایتون

پیش از هر چیزی باید ابتدا ماژولی به نام json را به درون برنامه ضمیمه کنیم. این ماژول شامل تمامی توابعی است که برنامه های پایتون برای کار با فرمت داده json نیاز دارند. برای تبدیل شی های پایتون به شی json از متد ()dumps استفاده می شود. این متد حداقل یک شی پایتون مانند دیکشنری را دریافت می کند و سپس فرمت شده json متغیر ورودی را برگشت می دهد.

اگر بخواهیم در خروجی کلیدهای مرتب شوند باید مقدار پارامتر sort_keys به برابر با مقدار True باشد. همچنین می تواننید چگونگی مرتب سازی دیشکنری ها را از اینجا بخوانید. همچنین برای مرتب سازی تاپل ها و لیست ها نیز این مطلب را بخوانید. پارامتر دیگری که می توانیم در متد ()dumps استفاده کنیم، indent نام دارد که فرمت json قابل نمایش را با فاصله گذاری در خروجی نشان می دهد. لطفا شکل زیر و شکل بالا را با هم مقایسه کنید.

خواندن از فایل json

به حالتی که شی پایتون را به شی یا فرمت json تبدیل می کنیم، عملیات decoding می گویم. عکس decoding عملیات decoding نام دارد که باید داده های به فرمت json را به نوع پایتون تبدیل کنیم. برای این کار فرض می کنیم می خواهیم یک فایل روی دیسک را بخونیم و اطلاعات آنرا در یک متغیر پایتون ذخیره کنیم. فرض می کنیم که محتوای json همین مطلب را در یک فایل با نام دلخواه ذخیره کرده اید.

نخستین گام برای خواند فایل json ضمیمه کردن ماژول json است. سپس توسط تابع ()open فایل حاوی داده های json را می خوانیم. دلیل استفاده از تابع ()open این است که در واقع می خواهیم یک توصیفگر فایل (file descriptor) به فایل json ایجاد شود. همانطور که متد ()dumps شی پایتون را تبدیل به فرمت json (یا شی json) می کند، متد ()loads عملیات عکس آنرا انجام می دهد. در کد زیر توسط این متد محتوای فایلی که متغیر fd به آن اشاره می کند، خوانده می شود. اگر به خروجی دقت کنید، خواهید دید متغیر data از نوع دیکشنری است.

چون خروجی تابع ()load به صورت دیکشنری است، پس می توانیم از طریق نام کلید به محتوای دیشکنری دسترسی داشته باشیم. با توجه به خروجی شکل بالا، دستورهای زیر مقادیر کلیدهای مختلف را نشان می دهند. همانطور که از شکل زیر مشخص است، وضعیت هوای تهران صاف (Clear) است.

تفاوت متد ها ()load و ()loads

در نمونه بالا از متد ()load استفاده کردیم. این متد به عنوان ورودی یک file descriptor به یک فایل با محتوای json را دریافت می کند و سپس محتوای درون فایل را به متغیری از نوع دیکشنری تبدیل می کند. در مقابل متد ()loads وجود دارد که برای کار با ورودی رشته است. متد ()loads به جای دریافت file descriptor، یک شی را دریافت و محتوای آنرا تبدیل به نوع دیکشنری می کند.

نوشتن محتوای json

بر روی فایلنخستین گام برای ایجاد محتوای json توسط متد ()dumps است. همانطور که گفتیم متد ()dumps یک دیکشنری را دریافت و سپس آنرا به شی json تبدیل می کند ولی متد ()dump محتوای یک فایل را خوانده و تبدیل به شی json می کند. در مثال زیر می خواهیم مقدار یک ارایه از دیکشنری ها را درون یک فایل به نام new_json_data.json ذخیره کنیم.

خواندن محتوای json از روی منابع (URL) اینترنت

خواندن محتوای json از روی اینترنت شبیه به خواندن از روی فایل است، با این تفاوت که دیگر نمی توانیم توسط تابع ()open فایل را باز کنیم بلکه باید از ماژول دیگری برای این کار استفاده کنیم. برای مثال می خواهیم از طریق سایت https://httpbin.org/ip که توسط پایتون و فریم ورک Flask نوشته شده است، آدرس IP عمومی که ISP در اختیار ما قرار می دهد را پیدا کنید.

در قطعه کد بالا ابتدا از متد ()urlopen از ماژول urllib.request برای خواندن محتوای آدرس ذخیره شده در متغیری به نام url استفاده کرده ایم و خروجی را در متغیر جدیدی به نام response ذخیره کرده ایم. سپس توسط متد ()loads از ماژول json محتوای متغیر درون response را خوانده و در متغیر ip ذخیره کرده ایم. توجه کنید که متغیر ip از نوع دیکشنری است. در نهایت مقدار محتوای متغیر ip را نشان داده ایم. همانگونه که آشکار است، متغیر ip دارای یک کلید به نام origin است که می توانیم با دسترسی به آن، آدرس IP را پیدا کنیم، بنابراین باید از دستور زیر برای دسترسی به مقدار کلید origin استفاده کنیم.

دانلود کد Python JSON Part 1