Menu

JavaScript'te JSON: JSON.stringify ve JSON.parse Rehberi

JavaScript nesnelerini JSON'a çevirmek ve geri almak — JSON.stringify, JSON.parse, replacer ve reviver fonksiyonları ile gidiş-dönüşte kaybolan değerler.

JSON Bir Nesne Değil, Metindir

JSON (JavaScript Object Notation), veri alışverişi için kullanılan bir metin formatıdır. Görünüş olarak JavaScript nesne literaline benzer ama aslında bir string'dir — yani ağ üzerinden gönderebileceğiniz, dosyaya kaydedebileceğiniz ya da bir config dosyasına yapıştırabileceğiniz bir karakter dizisidir.

// Bir JavaScript nesnesi — bellekteki canlı bir değer.
const user = { name: "Rosa", age: 30 };

// JSON — aynı veriyi temsil eden bir metin dizesi.
const json = '{"name":"Rosa","age":30}';

İkisini birbirine karıştırmak çok kolay, çünkü gerçekten benziyorlar. Kafanda net tutman için şöyle düşün: nesneler (object) programının içinde yaşar; JSON ise o nesnelerin dışarı çıkarken aldığı hâldir. Aralarındaki dönüşümü iki fonksiyonla yaparsın: JSON.stringify (nesneden string'e) ve JSON.parse (string'ten nesneye).

JSON.stringify: Nesneyi JSON'a Çevirme

Herhangi bir JavaScript değerini JSON karşılığına dönüştürür:

index.js
Output
Click Run to see the output here.

Sonuç tek satırlık, boşluksuz bir string — kompakt ve ağ üzerinden göndermek için biçilmiş kaftan. typeof kontrolü de bunu doğruluyor: string, object değil.

Debug sırasında daha okunaklı bir çıktı istiyorsan iki ek argüman daha verebilirsin. İkincisi replacer (ona birazdan geliyoruz); null geçmek "her şeyi dahil et" anlamına gelir. Üçüncüsü ise girinti miktarı:

index.js
Output
Click Run to see the output here.

Standart pretty-print görünümü bu. 2 ya da 4 boşluk kullan — çoğu aracın ürettiği format da zaten böyle.

JSON.parse: String'i nesneye çevirme

Tam tersi yönde çalışır: elinde bir JSON string'i var, geriye JavaScript değeri alıyorsun.

index.js
Output
Click Run to see the output here.

Parse edildikten sonra elinde sıradan bir JS nesnesi var — nokta ile erişim, köşeli parantezle erişim, dizi metotları, hepsi çalışır.

JSON.parse oldukça titiz bir fonksiyondur. Aşağıdakilerin hepsi SyntaxError fırlatır:

JSON.parse("{name: 'Rosa'}");      // tırnaksız anahtar, tek tırnak
JSON.parse('{"name": "Rosa",}');   // sondaki virgül
JSON.parse("// a comment\n{}");    // yorumlara izin verilmez
JSON.parse("");                    // boş dize

Programınızın dışından gelen her veri için — bir fetch yanıtı, bir dosya ya da kullanıcı girdisi fark etmez — JSON.parse çağrısını mutlaka try/catch bloğuna sarın:

index.js
Output
Click Run to see the output here.

Round-Trip'te Hayatta Kalamayan Değerler

JSON yalnızca altı değer türünü destekler: string'ler, sayılar, boolean'lar, null, diziler ve düz nesneler. JavaScript'teki bunların dışında kalan her şey ya yok olur, ya başka bir şeye dönüşür ya da hata fırlatır.

index.js
Output
Click Run to see the output here.

Neler oluyor:

  • Fonksiyonlar ve undefined değerleri, nesnelerden sessizce silinir. Diziler içindeyse null'a dönüşürler — çünkü JSON'da dizilerin boşluk barındırmasına izin yok.
  • Date nesneleri, kendi toJSON metodu üzerinden ISO formatında bir string'e serileştirilir. Parse ettiğinizde ise elinize Date değil, o string geri döner.
  • BigInt doğrudan TypeError fırlatır. JSON sayılarında karşılığı yok.
  • Map, Set ve dairesel referanslar da kutudan çıktığı gibi çalışmaz.

Date nesnelerini kayıpsız geri döndürmenin yolu, JSON.parse'ın reviver fonksiyonundan geçiyor:

index.js
Output
Click Run to see the output here.

Reviver fonksiyonu her anahtar/değer çifti için çalışır ve gelen değerleri okuma sırasında dönüştürmenize olanak tanır.

Replacer: Serileştirilecek Alanları Filtrelemek

JSON.stringify fonksiyonunun ikinci parametresi, çıktıda nelerin yer alacağını kontrol etmenizi sağlar. Yalnızca belirli anahtarları dahil etmek için bir dizi geçirebilirsiniz:

index.js
Output
Click Run to see the output here.

Ya da rastgele bir mantık için fonksiyon verebilirsin — alanları ayıklamak, değerleri maskelemek, anlık dönüşüm yapmak için birebir:

index.js
Output
Click Run to see the output here.

undefined döndürürsen o anahtar tamamen silinir. Başka bir değer döndürürsen de anahtarın değeri onunla değiştirilir.

toJSON ile özelleştirme

Bir nesnenin toJSON metodu varsa, JSON.stringify önce onu çağırır ve serileştirme işlemini dönen değer üzerinden yapar. Date nesnesinin kendi formatını bu şekilde belirlediğini biliyor muydun? Aynı mekanizmayı sen de kendi nesnelerinde kullanabilirsin:

index.js
Output
Click Run to see the output here.

Genel API şekli kimin serialize ettiğinden bağımsız olarak tutarlı kalsın isteyen sınıflar için birebir.

Derin Kopyalama (Eski Numara ve Daha İyisi)

Yıllarca, sade bir nesneyi derin kopyalamanın tek satırlık yolu JSON.parse(JSON.stringify(obj)) oldu:

index.js
Output
Click Run to see the output here.

Bu yöntem işinizi görür — ama yalnızca nesnenin içinde JSON ile uyumlu değerler varsa. Tarihler, Map'ler ve fonksiyonlar bu yaklaşımı bozar (yukarıdaki gidiş-dönüş sorunlarına bakın).

Modern JavaScript'te structuredClone var; bu fonksiyon Date, Map, Set, tipli diziler ve hatta döngüsel referanslarla sorunsuz çalışır:

index.js
Output
Click Run to see the output here.

Mümkün olduğunda structuredClone'a başvurun. JSON.parse(JSON.stringify(...)) numarasını da düz verilerin hızlı ve pratik kopyaları için yedekte tutun.

Gerçek Bir Örnek: Veri Çekme ve Parse Etme

JSON ile en sık karşılaşacağınız yer HTTP istekleridir. fetch sizin için JSON'u otomatik parse etmez — response üzerinde .json() çağırmanız gerekir (ki bu da aslında response body üzerinde JSON.parse çalıştırır):

index.js
Output
Click Run to see the output here.

JSON göndermek ise tam tersi bir işlem: gövdeyi JSON.stringify ile string'e çevirip Content-Type header'ını ayarlıyoruz.

await fetch("/api/users", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ name: "Rosa", age: 30 }),
});

Bu iki kalıp, gerçek hayatta karşılaşacağınız JSON işlerinin büyük çoğunluğunu kapsıyor.

Sırada: Optional Chaining

Parse edilmiş JSON'larda çoğu zaman opsiyonel alanlar bulunur — var olmayabilecek bir user.address.city, ya da eksik olabilecek bir response.data.items gibi. İç içe geçmiş özelliklere hata almadan erişmek tam olarak optional chaining (?.) operatörünün işi; bir sonraki sayfanın konusu da bu.

Sıkça Sorulan Sorular

JSON ile JavaScript nesnesi arasındaki fark nedir?

JSON aslında bir metin formatı — görünüşü JavaScript nesne literaline benzeyen ama daha katı kuralları olan bir string. Anahtarlar çift tırnaklı olmak zorunda, string değerler de çift tırnak kullanır ve değerler yalnızca string, sayı, boolean, null, dizi veya düz nesne olabilir. JavaScript nesnesi ise bellekteki canlı bir değerdir; fonksiyon, undefined, Date örneği gibi her şeyi tutabilir.

Bir JavaScript nesnesini JSON'a nasıl çeviririm?

JSON.stringify(obj) çağırman yeterli. Nesneyi dolaşıp sana bir JSON string'i döndürür. Okunur hale getirmek istersen JSON.stringify(obj, null, 2) şeklinde üçüncü argümanı kullanabilirsin — 2 boşlukla girintili basar. Dikkat: Nesnelerdeki fonksiyonlar ve undefined değerler tamamen düşer, dizilerin içindeyse null'a dönüşür.

JSON.parse neden hata fırlatıyor?

JSON.parse oldukça katıdır: sondaki fazladan virgül, tek tırnak, tırnaksız anahtarlar ve yorum satırları hepsi SyntaxError verir. String bir network isteğinden, dosyadan veya kullanıcıdan geliyorsa — yani her an geçersiz olabileceği bir durumda — çağrıyı try/catch içine almayı unutma.

JSON.stringify Date nesnesini korur mu?

Hayır. Date nesnesi "2026-01-15T10:30:00.000Z" gibi bir ISO string'e dönüşür. JSON.parse ile geri aldığında elinde Date değil, o string olur. Tekrar Date nesnesine ihtiyacın varsa JSON.parse'ın reviver argümanını kullanıp ISO string'leri elle Date'e çevirebilirsin.

Coddy ile kodlamayı öğren

BAŞLA