48- آموزش جاوااسکریپت | کار با JSON در AJAX و XMLHttpRequest
در این آموزش یاد میگیرید چگونه با استفاده از AJAX و XMLHttpRequest دادههای JSON را از فایل محلی دریافت، به آبجکت جاوااسکریپت تبدیل و در صفحه نمایش دهید. همچنین با دریافت یک شیء تکی و آرایهای از دادهها آشنا میشوید.
در این بخش، کار با AJAX و XMLHttpRequest را ادامه میدهیم؛ با این تفاوت که بهجای فایل متنی ساده، از دادههای JSON استفاده خواهیم کرد.
JSON مخفف JavaScript Object Notation است و یکی از رایجترین فرمتها برای تبادل داده بین کلاینت و سرور محسوب میشود. بیشتر APIها دادهها را در همین قالب برمیگردانند، بنابراین یادگیری کار با JSON اهمیت زیادی دارد.
ساختار صفحه
در این مثال، صفحه شامل دو دکمه است:
- دکمه اول برای دریافت یک مشتری
- دکمه دوم برای دریافت چند مشتری
همچنین دو بخش جداگانه برای نمایش خروجی در نظر گرفته شده است.
<div class="container">
<button id="button1">Get Customer</button>
<button id="button2">Get Customers</button>
<br><br>
<div id="customer"></div>
<div id="customers"></div>
</div>
<script src="app.js"></script>
ایجاد فایل JSON برای یک مشتری
ابتدا یک فایل به نام customer.json میسازیم. این فایل فقط شامل اطلاعات یک مشتری است.
{
"id": 1,
"name": "John Doe",
"company": "123 Designs",
"phone": "555-555-5555"
}
نکته مهم درباره ساختار JSON
ساختار JSON بسیار شبیه آبجکتهای جاوااسکریپت است، اما یک تفاوت مهم دارد:
در JSON کلیدها و مقادیر رشتهای باید حتماً داخل دابل کوتیشن قرار بگیرند.
نمونه نادرست:
{
id: 1,
name: 'John Doe'
}
نمونه درست:
{
"id": 1,
"name": "John Doe"
}
اگر فایل JSON از نظر نگارشی درست نباشد، هنگام parse کردن با خطا مواجه میشوید.
دریافت یک مشتری با XMLHttpRequest
اکنون در فایل app.js برای دکمه اول یک رویداد کلیک تعریف میکنیم تا اطلاعات مشتری از فایل customer.json خوانده شود.
document.getElementById('button1').addEventListener('click', loadCustomer);
function loadCustomer() {
const xhr = new XMLHttpRequest();
xhr.open('GET', 'customer.json', true);
xhr.onload = function () {
if (this.status === 200) {
console.log(this.responseText);
}
};
xhr.send();
}
در این مثال:
- با
XMLHttpRequestیک درخواست جدید میسازیم. - با
openمشخص میکنیم که درخواست از نوعGETاست. - مسیر فایل
customer.jsonرا تعیین میکنیم. - در
onloadپاسخ را دریافت میکنیم. - در انتها با
sendدرخواست را ارسال میکنیم.
تبدیل JSON به آبجکت جاوااسکریپت
مقدار responseText بهصورت رشته برمیگردد. برای اینکه بتوانیم به ویژگیهایی مثل name یا company دسترسی داشته باشیم، باید آن را با JSON.parse() به آبجکت جاوااسکریپت تبدیل کنیم.
document.getElementById('button1').addEventListener('click', loadCustomer);
function loadCustomer() {
const xhr = new XMLHttpRequest();
xhr.open('GET', 'customer.json', true);
xhr.onload = function () {
if (this.status === 200) {
const customer = JSON.parse(this.responseText);
console.log(customer);
}
};
xhr.send();
}
نمایش مشتری در صفحه
بعد از تبدیل داده، میتوانیم آن را در صفحه نمایش دهیم.
document.getElementById('button1').addEventListener('click', loadCustomer);
function loadCustomer() {
const xhr = new XMLHttpRequest();
xhr.open('GET', 'customer.json', true);
xhr.onload = function () {
if (this.status === 200) {
const customer = JSON.parse(this.responseText);
const output = `
<ul>
<li>ID: ${customer.id}</li>
<li>Name: ${customer.name}</li>
<li>Company: ${customer.company}</li>
<li>Phone: ${customer.phone}</li>
</ul>
`;
document.getElementById('customer').innerHTML = output;
}
};
xhr.send();
}
در اینجا:
- دادهی
JSONبه آبجکت تبدیل میشود. - با استفاده از
template literalخروجی HTML ساخته میشود. - خروجی در عنصر
customerقرار میگیرد.
ایجاد فایل JSON برای چند مشتری
حالا یک فایل دیگر به نام customers.json میسازیم که شامل آرایهای از چند مشتری است.
[
{
"id": 1,
"name": "John Doe",
"company": "123 Designs",
"phone": "555-555-5555"
},
{
"id": 2,
"name": "Steve Smith",
"company": "Hello Productions",
"phone": "555-555-5556"
},
{
"id": 3,
"name": "Tara Williams",
"company": "Traversy Media",
"phone": "555-555-5557"
}
]
در اینجا بهجای یک آبجکت، با یک آرایه از آبجکتها سروکار داریم.
دریافت چند مشتری
برای دریافت چند مشتری، برای دکمه دوم هم یک رویداد کلیک تعریف میکنیم.
document.getElementById('button2').addEventListener('click', loadCustomers);
function loadCustomers() {
const xhr = new XMLHttpRequest();
xhr.open('GET', 'customers.json', true);
xhr.onload = function () {
if (this.status === 200) {
console.log(this.responseText);
}
};
xhr.send();
}
تبدیل آرایه JSON و پیمایش دادهها
چون داده دریافتی یک آرایه است، بعد از parse کردن باید آن را پیمایش کنیم.
document.getElementById('button2').addEventListener('click', loadCustomers);
function loadCustomers() {
const xhr = new XMLHttpRequest();
xhr.open('GET', 'customers.json', true);
xhr.onload = function () {
if (this.status === 200) {
const customers = JSON.parse(this.responseText);
console.log(customers);
}
};
xhr.send();
}
نمایش چند مشتری در صفحه
برای نمایش همه مشتریها، از forEach استفاده میکنیم و خروجی هر مورد را به یک متغیر اضافه میکنیم.
document.getElementById('button2').addEventListener('click', loadCustomers);
function loadCustomers() {
const xhr = new XMLHttpRequest();
xhr.open('GET', 'customers.json', true);
xhr.onload = function () {
if (this.status === 200) {
const customers = JSON.parse(this.responseText);
let output = '';
customers.forEach(function (customer) {
output += `
<ul>
<li>ID: ${customer.id}</li>
<li>Name: ${customer.name}</li>
<li>Company: ${customer.company}</li>
<li>Phone: ${customer.phone}</li>
</ul>
`;
});
document.getElementById('customers').innerHTML = output;
}
};
xhr.send();
}
در این بخش:
customersیک آرایه از آبجکتها است.- با
forEachروی همه اعضا پیمایش انجام میدهیم. - برای هر مشتری یک بلوک HTML تولید میکنیم.
- در پایان کل خروجی را داخل عنصر
customersقرار میدهیم.
نمونه کامل کد جاوااسکریپت
در نهایت، کد کامل app.js به شکل زیر خواهد بود:
document.getElementById('button1').addEventListener('click', loadCustomer);
document.getElementById('button2').addEventListener('click', loadCustomers);
function loadCustomer() {
const xhr = new XMLHttpRequest();
xhr.open('GET', 'customer.json', true);
xhr.onload = function () {
if (this.status === 200) {
const customer = JSON.parse(this.responseText);
const output = `
<ul>
<li>ID: ${customer.id}</li>
<li>Name: ${customer.name}</li>
<li>Company: ${customer.company}</li>
<li>Phone: ${customer.phone}</li>
</ul>
`;
document.getElementById('customer').innerHTML = output;
}
};
xhr.send();
}
function loadCustomers() {
const xhr = new XMLHttpRequest();
xhr.open('GET', 'customers.json', true);
xhr.onload = function () {
if (this.status === 200) {
const customers = JSON.parse(this.responseText);
let output = '';
customers.forEach(function (customer) {
output += `
<ul>
<li>ID: ${customer.id}</li>
<li>Name: ${customer.name}</li>
<li>Company: ${customer.company}</li>
<li>Phone: ${customer.phone}</li>
</ul>
`;
});
document.getElementById('customers').innerHTML = output;
}
};
xhr.send();
}
خطاهای رایج در کار با JSON
در این نوع تمرینها یکی از رایجترین خطاها، اشتباه در ساختار فایل JSON است. برای مثال:
- جا افتادن
} - استفاده نکردن از دابل کوتیشن
- قرار دادن ویرگول اضافی
- اشتباه در ساختار آرایه
نمونه ساختار نادرست:
[
{
"id": 1,
"name": "John Doe"
,
{
"id": 2,
"name": "Steve Smith"
}
]
نمونه ساختار درست:
[
{
"id": 1,
"name": "John Doe"
},
{
"id": 2,
"name": "Steve Smith"
}
]
اگر ساختار JSON نادرست باشد، JSON.parse() خطا تولید میکند.
ارتباط این مثال با APIهای واقعی
اگرچه در این آموزش دادهها را از فایلهای محلی دریافت کردیم، اما همین منطق در کار با APIهای واقعی هم استفاده میشود.
در پروژههای عملی نیز معمولاً:
- یک درخواست به سرور ارسال میشود
- پاسخ
JSONدریافت میشود - داده با
JSON.parse()یا روشهای جدیدتر پردازش میشود - خروجی در رابط کاربری نمایش داده میشود
بنابراین این مثال، پایهای مناسب برای درک کار با APIها در جاوااسکریپت است.
جمعبندی
در این آموزش با نحوه دریافت و نمایش دادههای JSON با AJAX و XMLHttpRequest آشنا شدیم. مهمترین نکات این بخش عبارتاند از:
JSONفرمت استاندارد و رایج برای تبادل داده است.- پاسخ دریافتی از
XMLHttpRequestدرresponseTextبهصورت رشته قرار میگیرد. - برای استفاده از دادهها باید از
JSON.parse()استفاده کنیم. - اگر پاسخ یک آبجکت تکی باشد، میتوان مستقیماً ویژگیهای آن را نمایش داد.
- اگر پاسخ یک آرایه باشد، باید با حلقه یا
forEachروی آن پیمایش انجام دهیم. - همین الگو در کار با
APIهای خارجی نیز کاربرد دارد.
در بخش بعدی، همین مفاهیم را برای دریافت داده از یک API عمومی به کار خواهیم گرفت.