Türkiye'de ilk Mobil & PC Aynı Anda Metin2 Oyna. Triarchonline kalıcı ve uzun ömürlü yapısı ile 24 Temmuz'da açılıyor. | 1-99 Mobil Metin2 Triarch HEMEN TIKLA!
[NODE JS] JSON.parse ve JSON.stringify
Selam arkadaşlar. JSON, web dünyasının veri alışverişi için kullandığı en yaygın format ve Node.js'te sürekli JSON ile çalışıyoruz. API'den veri alıyorsunuz JSON, dosyaya yazıyorsunuz JSON, konfigürasyon dosyası JSON. JSON.parse ve JSON.stringify bu dönüşümleri yapan iki temel fonksiyon. Basit görünür ama ikisinin de ileri düzey özellikleri ve dikkat edilmesi gereken noktaları var.
JSON.parse - String'den Objeye
JSON.parse bir JSON string'ini JavaScript nesnesine dönüştürür. API'den gelen yanıtları, dosyadan okunan konfigürasyonları ve WebSocket mesajlarını parse etmek için kullanırız. Her JSON.parse çağrısını try-catch içine almak şart çünkü geçersiz JSON kesinlikle SyntaxError fırlatır.
Ben production'da JSON.parse'ın reviver parametresini çok kullanıyorum. Bu özellik JSON'dan objeye dönüşüm sırasında her değeri özelleştirmenizi sağlar. Mesela tarih string'lerini otomatik Date objesine çevirmek için mükemmel.
JavaScript:
// === JSON.PARSE ===
// Temel kullanım
const jsonString = '{"isim":"Ahmet","yas":28,"aktif":true}';
const obje = JSON.parse(jsonString);
console.log(obje.isim); // 'Ahmet'
console.log(typeof obje.yas); // 'number'
// Güvenli parse fonksiyonu (her zaman try-catch!)
function guvenliParse(jsonStr, varsayilan = null) {
try {
return JSON.parse(jsonStr);
} catch (hata) {
console.error('JSON parse hatası:', hata.message);
return varsayilan;
}
}
console.log(guvenliParse('{"valid": true}')); // { valid: true }
console.log(guvenliParse('geçersiz json')); // null
console.log(guvenliParse('', {})); // {}
// Reviver parametresi - dönüşüm sırasında değerleri değiştirme
const tarihliJSON = '{"isim":"Proje A","baslangic":"2024-01-15T10:30:00.000Z","bitis":"2024-06-30T18:00:00.000Z","butce":50000}';
const proje = JSON.parse(tarihliJSON, (key, value) => {
// ISO tarih formatını algıla ve Date'e çevir
if (typeof value === 'string' && /^\d{4}-\d{2}-\d{2}T/.test(value)) {
return new Date(value);
}
return value;
});
console.log('Proje:', proje);
console.log('Başlangıç tipi:', proje.baslangic instanceof Date); // true
console.log('Gün:', proje.baslangic.toLocaleDateString('tr-TR'));
// Reviver ile hassas sayı işleme
const finansJSON = '{"tutar": 1234567890123456789, "kur": 32.45}';
const finans = JSON.parse(finansJSON, (key, value) => {
if (key === 'tutar') return BigInt(value); // Büyük sayılar için
return value;
});
// JSON desteklediği veri tipleri
console.log('
--- JSON Desteklenen Tipler ---');
const desteklenen = JSON.parse(`{
"string": "merhaba",
"number": 42,
"boolean": true,
"null_value": null,
"array": [1, 2, 3],
"nested": {"a": 1}
}`);
console.log(desteklenen);
// JSON'da DESTEKLENMEYENler:
// undefined, function, Symbol, Infinity, NaN, Date (string olarak saklanır)
// RegExp, Map, Set, BigInt
JSON.stringify - Objeden String'e
JSON.stringify bir JavaScript nesnesini JSON string'ine dönüştürür. API yanıtları oluşturmak, dosyaya kaydetmek ve log mesajları formatlamak için kullanırız. replacer ve space parametreleri çoğu kişinin bilmediği ama çok kullanışlı özellikler.
Benim en çok kullandığım özellik space parametresi. JSON.stringify(obj, null, 2) ile okunabilir çıktı alırsınız, debug yaparken hayat kurtarır. replacer parametresi ile hassas verileri filtreleyebilir, özel dönüşümler yapabilirsiniz.
JavaScript:
// === JSON.STRİNGİFY ===
const kullanici = {
isim: 'Ahmet',
yas: 28,
email: 'ahmet@test.com',
sifre: 'gizli123',
adres: {
sehir: 'İstanbul',
ilce: 'Kadıköy'
},
hobiler: ['kodlama', 'yüzme']
};
// Temel kullanım
console.log(JSON.stringify(kullanici));
// Tek satır, okunması zor
// Formatlı çıktı (space parametresi)
console.log(JSON.stringify(kullanici, null, 2));
// Güzel indentlenmiş çıktı
// Tab ile indentleme
console.log(JSON.stringify(kullanici, null, ' '));
// Replacer - Array ile sadece belirli alanları dahil etme
const guvenli = JSON.stringify(kullanici, ['isim', 'email', 'adres', 'sehir'], 2);
console.log('Güvenli (array):', guvenli);
// Replacer - Fonksiyon ile özelleştirme
const filtrelenmis = JSON.stringify(kullanici, (key, value) => {
// Şifre alanını gizle
if (key === 'sifre') return undefined; // undefined döndürülürse alan dahil edilmez
// String değerleri büyük harfe çevir
if (typeof value === 'string' && key !== '') return value.toUpperCase();
return value;
}, 2);
console.log('Filtrelenmiş:', filtrelenmis);
// toJSON metodu - özel serileştirme
class Urun {
constructor(isim, fiyat, stok) {
this.isim = isim;
this.fiyat = fiyat;
this.stok = stok;
this._dahiliId = Math.random().toString(36).substr(2, 9);
this._olusturma = new Date();
}
toJSON() {
return {
isim: this.isim,
fiyat: `${this.fiyat.toLocaleString('tr-TR')} TL`,
stokDurumu: this.stok > 0 ? 'Mevcut' : 'Tükendi',
olusturma: this._olusturma.toLocaleDateString('tr-TR')
// _dahiliId dahil edilmiyor
};
}
}
const laptop = new Urun('Laptop', 25000, 15);
console.log(JSON.stringify(laptop, null, 2));
// Dairesel referans sorunu ve çözümü
const a = { isim: 'A' };
const b = { isim: 'B', ref: a };
a.ref = b; // Dairesel referans!
// JSON.stringify(a); // TypeError: Converting circular structure to JSON
// Çözüm: Dairesel referansları tespit eden stringify
function guvenliStringify(obj, space = 2) {
const gorulenler = new WeakSet();
return JSON.stringify(obj, (key, value) => {
if (typeof value === 'object' && value !== null) {
if (gorulenler.has(value)) {
return '[Dairesel Referans]';
}
gorulenler.add(value);
}
return value;
}, space);
}
console.log('Dairesel:', guvenliStringify(a));
// Deep clone (basit objeler için)
const orijinal = { a: 1, b: { c: 2, d: [3, 4] } };
const klon = JSON.parse(JSON.stringify(orijinal));
klon.b.c = 99;
console.log('Orijinal:', orijinal.b.c); // 2 (değişmedi)
console.log('Klon:', klon.b.c); // 99
// Not: JSON clone'un sınırlamaları
// - undefined, function, Symbol kaybolur
// - Date string'e dönüşür
// - Map, Set, RegExp kaybolur
// - Dairesel referanslarda hata verir
// Modern alternatif: structuredClone(obj)
const modernKlon = structuredClone(orijinal);
console.log('Modern klon:', modernKlon);
JSON işlemleri basit görünür ama detayları bilmek önemli. Her JSON.parse'ı try-catch ile sarın, hassas verileri JSON.stringify'da filtreleyin, deep clone için structuredClone tercih edin. Bu basit kurallarla JSON ile ilgili sorun yaşamazsınız. Kolay gelsin.
Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)
Benzer konular
- Cevaplar
- 2
- Görüntüleme
- 387
- Cevaplar
- 5
- Görüntüleme
- 609
- Cevaplar
- 9
- Görüntüleme
- 233
- Kilitli
- Cevaplar
- 7
- Görüntüleme
- 2K
- Kilitli
- Cevaplar
- 1
- Görüntüleme
- 434
