İçeriğe geç
Educora
Orta15 dk10 / 27

JSON ve hata yönetimi

Verileri JSON biçiminde gönder ve al; programın çökmesin diye hataları `try...catch` ile yakala.

Kendini test et
Bu derste öğreneceklerin
  • JSON kurallarını bilmek ve onu bir JavaScript nesnesinden ayırt etmek
  • Verileri JSON.stringify ve JSON.parse ile dönüştürmek
  • Hataları try, catch, finally ve throw ile yönetmek

Bir hava durumu uygulaması Bakü'nün tahminini bir sunucudan alır. Sunucu ona nesne değil, metin gönderir; ağ üzerinden yalnızca metin taşınabilir. Peki bu metin yarım ya da bozuk gelirse? İyi bir program çökmez: sorunu yakalar ve kullanıcıya anlaşılır bir mesaj gösterir. Bu derste iki beceriyi de öğreneceksin.

JSON nedir?

JSON (JavaScript Object Notation), verileri metin olarak saklamak ve göndermek için kullanılan bir biçimdir. JavaScript nesnelerine çok benzer, ama her dil onu anlar: Python, Java, C# ve diğerleri. Bugün web siteleri, mobil uygulamalar ve sunucular birbirleriyle çoğunlukla JSON ile “konuşur”.

JSON
{
  "city": "Baku",
  "temperature": 24,
  "sunny": true,
  "forecast": [25, 27, 22],
  "wind": { "speed": 5, "direction": "north" },
  "warning": null
}
JSON'da anahtarlar ve string'ler her zaman çift tırnakla yazılır.
ÖzellikJavaScript nesnesiJSON
Anahtarlartırnaksız olabiliryalnızca çift tırnakla
String'lerher tür tırnakyalnızca çift tırnak
Fonksiyonlar, undefinedolurolmaz
Yorumlar, sondaki virgülolurolmaz

JSON.stringify ve JSON.parse

JSON.stringify bir nesneyi göndermek ya da kaydetmek için JSON string'ine çevirir. JSON.parse ise tersini yapar: JSON string'inden yeniden nesne oluşturur. Üçüncü argüman olarak 2 verirsen stringify metni girintilerle okunaklı biçimde düzenler.

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));
▸ Beklenen çıktı
{"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));
▸ Beklenen çıktı
{"name":"Leyla","born":"2010-05-28T00:00:00.000Z"}

Hatalar ve try...catch

Program çalışırken bir şeyler ters giderse JavaScript bir hata (exception) oluşturur. Yakalanmayan bir hata programı durdurur. En sık görülen türler şunlardır: SyntaxError (hatalı yazım, örneğin bozuk JSON), TypeError (bir değerle yapılamayacak işlem, örneğin null bir değerin özelliğini okumak) ve ReferenceError (var olmayan bir değişken).

Riskli kod bir try bloğuna konur. Orada hata olursa try'ın kalanı atlanır ve kontrol, hata nesnesini alan catch bloğuna geçer. finally bloğu ise hata olsa da olmasa da her zaman çalışır.

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);
}
▸ Beklenen çıktı
Could not read the data: SyntaxError
Check finished
Problem: TypeError
input metninde anahtar ve değer tırnaksız; bu JSON değil. city ve Baku kelimelerini çift tırnağa al ve kodu yeniden çalıştır.

Kendi hatanı fırlatmak: throw

Bazen JavaScript açısından her şey yolundadır ama programın mantığı bozulur: örneğin biri bakiyeden fazla para çekmek ister. Böyle durumlarda throw new Error('...') ile kendi hatanı oluşturursun. throw'dan sonraki kod çalışmaz ve hata en yakın catch'e kadar “uçar”.

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);
}
▸ Beklenen çıktı
70
Error: Not enough money
Güvenli okuma fonksiyonu

JSON geçerliyse nesneyi, bozuksa yedek değeri döndüren bir safeParse(text, fallback) fonksiyonu yaz.

Çözümü göster
JSON.parse'ı try içinde çağırıp sonucu döndürürüz.
Hata olursa catch bloğu fallback değerini döndürür.
Böyle bir fonksiyon programın geri kalanını hatalardan korur (koda bak).
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);
▸ Beklenen çıktı
[ 1, 2, 3 ]
[]
90
Alıştırma

readScore(text) fonksiyonunu tamamla: JSON metnini okuyup score değerini döndürmeli. Metin geçerli bir JSON değilse 'Invalid JSON' mesajlı, puan 0–100 aralığında değilse 'Score out of range' mesajlı bir hata fırlat (throw new Error(...)). Aşağıdaki döngü her sonucu ya da hata mesajını yazdırır.

Alıştırma · 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);
  }
}
▸ Beklenen çıktı
Score: 92
Error: Score out of range
Error: Invalid JSON

Önemli noktalar

  • JSON, verileri metin olarak taşımak için evrensel bir biçimdir; anahtarlar ve string'ler çift tırnakla yazılır.
  • JSON.stringify nesneyi metne, JSON.parse metni nesneye çevirir.
  • try riskli kodu içerir, catch hatayı yakalar, finally her zaman çalışır.
  • throw new Error('...') kendi hatanı oluşturur; ondan sonraki kod çalışmaz.
  • Hata nesnesinin name ve message özellikleri vardır; hataları sessizce yutma.

Kendini test et

10 soru. Her doğru cevap XP kazandırır.

1 / 10
Hangi satır geçerli bir JSON'dur?