Məzmuna keç
Educora
Orta15 dəq10 / 27

JSON və xətaların emalı

Verilənləri JSON formatında göndər və qəbul et, `try...catch` ilə xətaları tut ki, proqramın çökməsin.

Özünü yoxla
Bu dərsdə öyrənəcəksən
  • JSON formatının qaydalarını bilmək və onu JavaScript obyektindən fərqləndirmək
  • JSON.stringify və JSON.parse ilə verilənləri çevirmək
  • try, catch, finally və throw ilə xətaları idarə etmək

Hava proqramı Bakı üçün proqnozu serverdən alır. Server ona obyekt yox, mətn göndərir — şəbəkə ilə yalnız mətn ötürülə bilər. Bəs bu mətn yarımçıq gəlsə və ya səhv yazılsa? Yaxşı proqram çökmür: o, problemi tutur və istifadəçiyə aydın mesaj göstərir. Bu dərsdə hər iki bacarığı öyrənəcəksən.

JSON nədir?

JSON (JavaScript Object Notation) verilənləri mətn şəklində saxlamaq və ötürmək üçün formatdır. O, JavaScript obyektlərinə çox bənzəyir, amma bütün dillər onu başa düşür: Python, Java, C# və s. Bu gün saytlar, mobil tətbiqlər və serverlər bir-biri ilə əsasən JSON vasitəsilə «danışır».

JSON
{
  "city": "Baku",
  "temperature": 24,
  "sunny": true,
  "forecast": [25, 27, 22],
  "wind": { "speed": 5, "direction": "north" },
  "warning": null
}
JSON-da açarlar və sətirlər həmişə cüt dırnaqda yazılır.
XüsusiyyətJavaScript obyektiJSON
Açarlardırnaqsız ola biləryalnız cüt dırnaqda
Sətirləristənilən dırnaqyalnız cüt dırnaq
Funksiyalar, undefinedolarolmaz
Şərhlər, sonda vergülolarolmaz

JSON.stringify və JSON.parse

JSON.stringify obyekti JSON sətrinə çevirir — göndərmək və ya yadda saxlamaq üçün. JSON.parse isə əksini edir: JSON sətrindən yenidən obyekt yaradır. Üçüncü arqument kimi 2 versən, stringify mətni oxunaqlı şəkildə, girintilərlə düzür.

JavaScript
const weather = { city: 'Baku', temperature: 24, sunny: true };

const text = JSON.stringify(weather);
console.log(text);
console.log(typeof text);

const back = JSON.parse(text);
console.log(back.city, typeof back);

console.log(JSON.stringify({ name: 'Leyla', level: 3 }, null, 2));
▸ Gözlənilən nəticə
{"city":"Baku","temperature":24,"sunny":true}
string
Baku object
{
  "name": "Leyla",
  "level": 3
}
JavaScript
const profile = {
  name: 'Leyla',
  nickname: undefined,
  greet() { return 'Hi!'; },
  born: new Date('2010-05-28'),
};

console.log(JSON.stringify(profile));
▸ Gözlənilən nəticə
{"name":"Leyla","born":"2010-05-28T00:00:00.000Z"}

Xətalar və try...catch

Proqram icra olunarkən problem yarananda JavaScript xəta (exception) yaradır. Tutulmayan xəta proqramı dayandırır. Ən çox rast gəlinən növləri: SyntaxError (səhv yazılış, məsələn, pozuq JSON), TypeError (qiymətlə mümkün olmayan əməliyyat, məsələn, null-un xassəsini oxumaq) və ReferenceError (mövcud olmayan dəyişən).

Riskli kodu try blokuna yerləşdiririk. Orada xəta baş versə, try-ın qalan hissəsi ötürülür və idarə catch blokuna keçir; catch xəta obyektini alır. finally bloku isə xəta olub-olmamasından asılı olmayaraq həmişə icra olunur.

JavaScript
const input = '{ city: Baku }';

try {
  const data = JSON.parse(input);
  console.log('City:', data.city);
} catch (error) {
  console.log('Could not read the data:', error.name);
} finally {
  console.log('Check finished');
}

try {
  const user = null;
  console.log(user.name);
} catch (error) {
  console.log('Problem:', error.name);
}
▸ Gözlənilən nəticə
Could not read the data: SyntaxError
Check finished
Problem: TypeError
input mətnində açar və qiymət dırnaqsızdır — bu, JSON deyil. city və Baku sözlərini cüt dırnağa al və kodu yenidən işə sal.

Öz xətanı atmaq: throw

Bəzən JavaScript üçün hər şey qaydasındadır, amma proqramın məntiqi pozulur: məsələn, balansdan çox pul çıxarmaq istənilir. Belə hallarda throw new Error('...') ilə öz xətanı yaradırsan. throw-dan sonrakı kod icra olunmur, xəta isə ən yaxın catch-ə qədər «uçur».

JavaScript
function withdraw(balance, amount) {
  if (amount > balance) {
    throw new Error('Not enough money');
  }
  return balance - amount;
}

try {
  console.log(withdraw(100, 30));
  console.log(withdraw(100, 500));
  console.log('This line is never printed');
} catch (error) {
  console.log('Error:', error.message);
}
▸ Gözlənilən nəticə
70
Error: Not enough money
Təhlükəsiz oxuma funksiyası

Elə safeParse(text, fallback) funksiyası yaz ki, JSON düzgündürsə obyekti, pozuqdursa ehtiyat qiyməti qaytarsın.

Həllini göstər
JSON.parse-ı try içində çağırıb nəticəni qaytarırıq.
Xəta baş versə, catch bloku fallback-i qaytarır.
Belə funksiya proqramın qalan hissəsini xətalardan qoruyur (koda bax).
JavaScript
function safeParse(text, fallback) {
  try {
    return JSON.parse(text);
  } catch {
    return fallback;
  }
}

console.log(safeParse('[1, 2, 3]', []));
console.log(safeParse('oops', []));
console.log(safeParse('{"score": 90}', {}).score);
▸ Gözlənilən nəticə
[ 1, 2, 3 ]
[]
90
Tapşırıq

readScore(text) funksiyasını tamamla: o, JSON mətnini oxuyub score qiymətini qaytarmalıdır. Mətn düzgün JSON deyilsə, 'Invalid JSON' mesajlı, bal 0–100 aralığında deyilsə, 'Score out of range' mesajlı xəta at (throw new Error(...)). Aşağıdakı dövr hər nəticəni və ya xəta mesajını çap edir.

Tapşırıq · JavaScript
function readScore(text) {
  // 1) JSON.parse inside try...catch → throw new Error('Invalid JSON')
  // 2) score outside 0–100 → throw new Error('Score out of range')
  // 3) return the score
}

const inputs = ['{"score": 92}', '{"score": 140}', '{score: 50}'];

for (const text of inputs) {
  try {
    console.log('Score:', readScore(text));
  } catch (error) {
    console.log('Error:', error.message);
  }
}
▸ Gözlənilən nəticə
Score: 92
Error: Score out of range
Error: Invalid JSON

Əsas fikirlər

  • JSON verilənləri mətn kimi ötürmək üçün universal formatdır; açarlar və sətirlər cüt dırnaqda yazılır.
  • JSON.stringify obyekti mətnə, JSON.parse mətni obyektə çevirir.
  • try riskli kodu saxlayır, catch xətanı tutur, finally həmişə icra olunur.
  • throw new Error('...') öz xətanı yaradır; ondan sonrakı kod icra olunmur.
  • Xəta obyektinin name və message xassələri var; xətaları səssizcə udma.

Özünü yoxla

10 sual. Hər düzgün cavab XP qazandırır.

1 / 10
Hansı sətir düzgün JSON-dur?