javascriptJSONJSON در جاوااسکریپت
JSON قالب متنی تبادل داده است. تبدیل متن با JSON.parse، ساخت متن با JSON.stringify و فرق آن با شیء جاوااسکریپت را با نمونهٔ تنظیمات یاد بگیرید.
مفهوم به زبان ساده
JSON یک قالب متنی برای نمایش و جابهجایی داده است؛ مثلاً تنظیمات یک برنامه یا پاسخ API. ظاهر آن به بعضی شکلهای نوشتن شیء در جاوااسکریپت نزدیک است، اما خود یک شیء زندهٔ جاوااسکریپت نیست. در JSON نام ویژگیها و مقدارهای رشتهای با کوتیشن دوتایی نوشته میشوند. توضیح کد، تابع و undefined بخشی از قالب JSON نیستند.
JSON.parse متن JSON را به مقدار جاوااسکریپت تبدیل میکند. این مقدار میتواند شیء، آرایه یا مقدار سادهٔ مجاز باشد. JSON.stringify در جهت مقابل، از مقدار سازگار یک متن JSON میسازد. در مثال، ابتدا تنظیمات را از متن میخوانیم، تعداد درسها را تغییر میدهیم و نسخهٔ تازهٔ متنی را تولید میکنیم. تغییر شیء بهتنهایی رشتهٔ اولیه را عوض نمیکند؛ باید متن جدید را صریحاً بسازیم و در صورت نیاز ذخیره کنیم.
تجزیهٔ موفق فقط نشان میدهد متن از نظر قالب قابل خواندن است؛ درستبودن نوع و محدودهٔ فیلدها را تضمین نمیکند. پس از parse، قرارداد داده را بررسی کنید. متن خراب خطا میدهد و میتوان آن را با #try-catch مدیریت کرد. تبدیل رفتوبرگشتی JSON را هم کپی بینقص همهٔ مقدارهای جاوااسکریپت ندانید؛ همهٔ نوعها قابل نمایش نیستند و برخی رفتارشان تغییر میکند. در تمرین، فیلد lessons را به رشته تبدیل کنید و ببینید چرا parse بهتنهایی این ناسازگاری قراردادی را رد نمیکند.
کجا به کار میآید؟
- خواندن و نوشتن تنظیمات یا فایل پشتیبان ساده
- تبادل دادهٔ ساختاریافته میان مرورگر و API
از تعریف تا یک مثال واقعی
const savedText = '{"title":"جاوااسکریپت","lessons":2}';
const settings = JSON.parse(savedText);
console.log(settings.title);
settings.lessons += 1;
const nextText = JSON.stringify(settings);
console.log(nextText);
console.log(typeof nextText);
جاوااسکریپت
{"title":"جاوااسکریپت","lessons":3}
stringاین مثال چطور کار میکند؟
savedText یک رشته است؛ هنوز شیء تنظیمات نیست.
parse شیء قابل استفاده در جاوااسکریپت را میسازد.
تعداد درسها در شیء از ۲ به ۳ تغییر میکند.
stringify متن تازه میسازد؛ typeof تأیید میکند نتیجه رشته است.
اشتباه رایج
JSON.parse به معنی اعتبارسنجی مدل نیست. همچنین undefined و تابع در ویژگیهای شیء با stringify نگهداری نمیشوند؛ برای یک قرارداد پایدار فقط نوعهای مجاز و روشن تعریف کنید.
این را به خاطر بسپارید
JSON متن داده است؛ parse و stringify مرز متن و مقدار را جابهجا میکنند و جای بررسی قرارداد داده را نمیگیرند.