آشنایی با JSON
در فصل دوم با مفهوم متغیر آشنا شدیم و در طول این کتاب بارها برای ذخیرهسازی انواع دادههای مختلف از متغیرها استفاده کردیم. اما دادههای ذخیره شده در متغیرها فقط تا زمانی که برنامه در حال اجرا است قابل استفاده هستند. یعنی با پایان اجرای برنامه، تمام دادههای ذخیره شده در تمام متغیرها از بین خواهند رفت. همچنین دادههای ذخیره شده در متغیرها، فقط در یک برنامه قابل استفاده هستند. یعنی برنامهها امکان دسترسی به دادههای ذخیره شده در متغیرهای سایر برنامهها را ندارند.
اما در بسیاری از برنامهها لازم است تا دادههای ذخیره شده در متغیرها، حتی بعد از پایان برنامه و در اجراهای بعدی برنامه نیز قابل دسترسی باشند. یعنی باید بتوان متغیرها را در یک حافظهی دائمی (مانند دیسک سخت) ذخیره کرد. همچنین در بسیاری از برنامهها نیاز است که دادههایی را از برنامهای دیگر دریافت کنیم. و یا دادههایی را به برنامهای دیگر ارسال کنیم.
برای ذخیرهسازی و تبادل دادهها بین برنامههای مختلف، قبل از هر چیز نیاز به یک زبان مشترک است. یعنی برنامهها باید بدانند که دادهها با چه قالبی ذخیره شدهاند، تا بتوانند آنها را بخوانند و تفسیر کنند. پس باید استانداردهایی برای ذخیرهسازی (و تبادل) دادهها وجود داشته باشد.
به طور کلی دادهها را به دو شکل دودویی (Binary) و متنی (Text) میتوان ذخیره کرد. تفاوتهای زیادی بین این دو روش ذخیرهسازی وجود دارد. اما به طور خلاصه میتوان تفاوت این دو روش را در دو مورد زیر بیان کرد. این دو مورد مزیت هر یک از روشها را نیز نشان میدهند.
- در روش متنی، دادهها به صورت رشتهای از کاراکترها ذخیره میشوند که معمولاً توسط انسان قابل درک هستند (Human Readable). اما دادههایی که به صورت دودویی ذخیره میشوند توسط انسان قابل درک نیستند.
- دادههای متنی معمولاً همراه با کمی اطلاعات اضافی ذخیره میشوند. به همین دلیل معمولاً حجم دادههایی که به صورتی متنی ذخیره میشوند بیشتر از معادل دودویی همان دادهها است. همچنین دادههای متنی پس از بارگذاری، نیاز به تفسیر بیشتری دارند. در نتیجه سرعت بارگذاری و تفسیر دادههای متنی کمتر از دادههای دودویی است.
تاکنون روشهای زیادی برای ذخیرهسازی دادهها به هر دو شکل دودویی و متنی به وجود آمده است. با نگاهی گذرا به فایلهای موجود بر روی کامپیوترتان میتوانید تعداد زیادی از این روشها را مشاهده کنید. در واقع پسوندهای متفاوتی که در نامگذاری فایلهای مختلف مشاهده میکنید، نشان دهندهی تفاوت در روش ذخیرهسازی دادهها در هر یک از این فایلها هستند. به هر یک از این روشها اصطلاحاً یک قالب یا Format نیز گفته میشود.
از انواع مشهور قالبهای دودویی ذخیرهسازی دادهها میتوان به قالبهایی مانند MP3، JPG، PNG، DOCX، MKV و ... اشاره کرد. اگر فایلی با یکی از این پسوندها را در یک ویرایشگر متن (مانند Notepad) باز کنید. متوجه خواهید شد که محتوای آن توسط انسان قابل درک نیست.
از انواع مشهور قالبهای متنی ذخیرهسازی دادهها نیز میتوان به قالبهایی مانند JSON، HTML، CSS، JS، XML، SVG و ... اشاره کرد. اگر فایلی با یکی از این پسوندها را در یک ویرایشگر متن باز کنید. مشاهده خواهید کرد که محتوای آن به راحتی توسط انسان قابل درک است.
در این بخش قصد داریم با قالب JSON آشنا شویم که یکی از انواع قالبهای متنی برای ذخیرهسازی دادهها میباشد. البته JSON بیش از اینکه برای ذخیرهسازی دادهها به کار رود، برای انتقال دادهها به کار میرود. امروزه JSON کاربرد بسیار زیادی برای انتقال دادهها بین برنامههای مختلف دارد. لازم به ذکر است که JSON هیچ وابستگی به هیج زبان برنامهنویسی خاصی ندارد و تقریباً در تمام زبانهای برنامهنویسی قابل استفاده است. با این حال بیشترین کاربرد آن در محیط وب و در زبان جاوا اسکریپت است. در فصل بعد که با مفهوم Ajax آشنا میشویم، خواهید دید که معمولاً (تقریباً همیشه) برای انتقال دادهها بین برنامههای جاوا اسکریپت و برنامههای سمت سرور از قالب JSON استفاده میشود.
قالب JSON
کلمهی JSON مخفف عبارت JavaScript Object Notation است. این عبارت نشان میدهد که روش ذخیرهسازی دادهها در قالب JSON، شباهت بسیار زیادی به روش تعریف اشیاء در جاوا اسکریپت دارد. پس برای برنامهنویسان جاوا اسکریپت یادگیری قواعد JSON کار بسیار سادهای خواهد بود. مجدداً تاکید میگردد که JSON جزئی از زبان جاوا اسکریپت نیست و صرفاً یک روش برای ذخیرهسازی و تبادل دادهها بوده و در هر زبان برنامهنویسی دیگری نیز قابل استفاده است.
در قالب JSON دادهها به ۳ دستهی زیر تقسیم میشوند :- مقادیر ساده (Simple Values) : اعداد، رشتهها و مقادیر true و false و همچنین مقدار null در این دسته قرار میگیرند. (نوع دادهی undefined در JSON وجود ندارد)
- اشیاء (Objects) : دقیقاً مانند اشیاء در جاوا اسکریپت، دادههایی که با جفتهای کلید-مقدار (key-value) ایجاد میشوند در این دسته قرار میگیرند. یعنی هر جفت کلید-مقدار، مانند خاصیتی از یک شئ در جاوا اسکریپت است.
- آرایهها (Arrays) : دقیقاً مانند آرایهها در جاوا اسکریپت هستند. یعنی برای ذخیرهسازی لیستی از دادههایی که با هم مرتبط بوده و دارای ترتیب هستند به کار میروند. و از اندیسهای عددی برای دسترسی به هر عضو از لیست استفاده میشود.
توجه کنید که انواع دادهی شئ و آرایه میتوانند به صورت تو در تو تعریف شوند. یعنی میتوان اشیائی را به عنوان اعضای یک آرایه تعریف کرد. و یا آرایههایی را به عنوان خاصیتهای یک شئ تعریف کرد. و یا آرایهای را در آرایهای دیگر و یا شیئی را در شیئی دیگر تعریف کرد. اما نکتهی مهم در قالب JSON این است که در هر فایل JSON فقط میتوان یکی از انواع فوق را به عنوان دادهی اصلی ذخیره کرد. (سایر دادهها میتوانند به صورت تو در تو، داخل دادهی اصلی ذخیره شوند)
برای درک بهتر هر یک از انواع دادههای فوق، چند مثال را با هم بررسی میکنیم. ابتدا با مقادیر ساده شروع میکنیم. به عنوان مثال متغیر زیر را در نظر بگیرید که یک مقدار رشتهای را در خود ذخیره کرده است.
let myVariable = "Hello World!";
جهت ذخیرهسازی محتوای این متغیر در یک فایل JSON باید به صورت زیر عمل کرد.
"Hello World!"
اولین نکته در این مثال ساده این است که در فایلهای JSON هیچ متغیری تعریف نمیشود. زیرا در هر فایل JSON فقط میتوان یک مقدار را به عنوان دادهی اصلی ذخیره کرد. در نتیجه نیازی به نامگذاری آن نیست. دومین نکته این است که در JSON نیز برای تعریف مقادیر رشتهای میتوان از Double Quote استفاده کرد. اما باید توجه داشته باشید که در JSON این تنها راه برای تعریف مقادیر رشتهای است. یعنی استفاده از Single Quote و یا Backtick برای تعریف رشتهها در JSON مجاز نیست.
برای ذخیرهسازی مقادیر سادهی عددی نیز کافی است مقدار مورد نظر را در فایل JSON قرار دهیم و نیازی به هیچ کاراکتر اضافی نخواهد بود. مثلاً متغیر عددی زیر را در نظر بگیرید.
let myVar = 445;
برای ذخیرهسازی این مقدار در یک فایل JSON میتوان مقدار 445 را به شکل زیر در یک فایل ذخیره کرد.
445
همچنین مقادیر false، true و null نیز دقیقاً به همین شکل در فایلهای JSON قابل ذخیرهسازی هستند.
اما معمولاً از فایلهای JSON برای ذخیرهسازی مقادیر ساده استفاده نمیشود و معمولاً یک شئ یا یک آرایه در فایلهای JSON ذخیره میشود. همچنین همانطور که اشاره شد در هر فایل JSON فقط میتوان یکی از ۳ نوع دادهی فوق را به عنوان دادهی اصلی ذخیره کرد. اما با توجه به اینکه اشیاء و آرایهها میتوانند به صورت تو در تو تعریف شوند، حجم زیادی از دادهها را میتوان به صورت یک شئ یا یک آرایه در یک فایل JSON ذخیره کرد.
حال شئ زیر را در نظر بگیرید.
const person = {
name: 'Abbas Moqaddam',
age: 34
};
برای ذخیرهسازی این شئ در یک فایل JSON میتوان به صورت زیر عمل کرد.
{
"name": "Abbas Moqaddam",
"age": 34
}
همانطور که مشاهده میکنید روش ذخیرهسازی اشیاء در قالب JSON، شباهت زیادی به روش تعریف اشیاء در جاوا اسکریپت دارد. به همین دلیل نیز این قالب را JSON نامگذاری کردهاند. اما با وجود این شباهت، باید به تفاوتهای زیر نیز توجه کنید :
- برای تعریف مقادیر رشتهای در JSON حتماً باید از Double Quote استفاده کرد. اما در جاوا اسکریپت میتوان از Single Quote یا Backtick نیز استفاده کرد.
- نام خاصیتها در JSON حتماً باید به صورت رشته تعریف شوند. یعنی نام هر خاصیت باید در Double Quote قرار داده شود. اما در جاوا اسکریپت این کار اختیاری است و معمولاً برنامهنویسان این کار را در جاوا اسکریپت انجام نمیدهند.
همانطور که اشاره شد اشیاء میتوانند به صورت تو در تو نیز تعریف شوند. مثلاً شئ زیر را در نظر بگیرید.
const person = {
name: {
firstname: 'Abbas',
lastname: 'Moqaddam'
},
age: 34
};
این شئ را نیز به راحتی میتوان در یک فایل JSON به صورت زیر ذخیره کرد.
{
"name": {
"firstname": "Abbas",
"lastname": "Moqaddam"
},
"age": 34
}
نحوهی ذخیرهسازی آرایهها در فایلهای JSON نیز کاملاً مشابه نحوهی تعریف آرایهها در جاوا اسکریپت است. به عنوان مثال آرایهی زیر را در نظر بگیرید.
const myArray = [10 , true , null , 'Hello'];
این آرایه را نیز به راحتی میتوان در یک فایل JSON به صورت زیر ذخیره کرد.
[10 , true , null , "Hello"]
به عنوان آخرین مثال آرایهی زیر را در نظر بگیرید که شامل ۳ عضو است که هر یک از اعضای آن یک شئ هستند.
const books = [
{
title: 'Beginning Functional JavaScript, 2nd Edition',
author: {
firstname: 'Anto',
lastname: 'Aravinth'
},
year: 2018
},
{
title: 'Introducing JavaScript Game Development',
author: {
firstname: 'Graeme',
lastname: 'Stuart'
},
year: 2017
},
{
title: 'Object Oriented JavaScript, 3rd Edition',
author: {
firstname: 'Stoyan',
lastname: 'Stefanov'
},
year: 2017
}
];
معادل این آرایه در قالب JSON به صورت زیر خواهد بود.
[
{
"title": "Beginning Functional JavaScript, 2nd Edition",
"author": {
"firstname": "Anto",
"lastname": "Aravinth"
},
"year": 2018
},
{
"title": "Introducing JavaScript Game Development",
"author": {
"firstname": "Graeme",
"lastname": "Stuart"
},
"year": 2017
},
{
"title": "Object Oriented JavaScript, 3rd Edition",
"author": {
"firstname": "Stoyan",
"lastname": "Stefanov"
},
"year": 2017
}
]
نکته : تمام فضاهای خالی و خطوط جدید که در مثالهای فوق به کار رفتهاند، صرفاً جهت خوانایی بیشتر میباشند. یعنی تمام دادههای موجود در فایل فوق را میتوان در یک خط به صورت زیر تعریف کرد.
[{"title":"Beginning Functional JavaScript, 2nd Edition","author":{"firstname":"Anto","lastname":"Aravinth"},"year":2018},{"title":"Introducing JavaScript Game Development","author":{"firstname":"Graeme","lastname":"Stuart"},"year":2017},{"title":"Object Oriented JavaScript, 3rd Edition","author":{"firstname":"Stoyan","lastname":"Stefanov"},"year":2017}]
معمولاً در فایلهای JSON از فضاهای خالی برای خوانایی بیشتر استفاده میشود. اما زمانی که از JSON برای انتقال دادهها بین برنامههای مختلف استفاده میشود، فضاهای خالی حذف میشوند. زیرا در این حالت سرعت انتقال دادهها اهمیت بیشتری نسبت به خوانایی و درک کدها توسط انسان دارد.
در این بخش با مفاهیم مربوط به قالب JSON آشنا شدیم، که یک قالب متنی برای ذخیرهسازی و تبادل داده است. در بخش بعد خواهیم دید که در JavaScript چه امکاناتی برای پردازش دادههای JSON وجود دارد. و در فصل بعد کاربردهای عملی JSON را در Ajax خواهیم دید.