Web'de veri taşımanın birden fazla yolu var. XML, CSV, YAML — seçenek çok. Ama pratikte API çağrılarının, yapılandırma dosyalarının ve veritabanı belgelerinin ezici çoğunluğu tek bir formatla çalışıyor: JSON.
JavaScript Object Notation. Douglas Crockford 2001'de tanıttı. Adında JavaScript geçiyor ama dilden bağımsız bir format — Python, Java, Go, PHP, C# dahil neredeyse tüm programlama dilleri JSON'u doğal olarak destekler. Hafif. Okunabilir. Parse etmesi kolay. Web'in fiili veri standardı haline gelmesinin arkasında bu üç özellik var. İlginç olan şu: Crockford JSON'u icat ettiğini değil, keşfettiğini söyler. Zaten var olan bir yapıyı formalize etmiş.
JSON nasıl görünür?
JSON, anahtar-değer (key-value) çiftlerinden oluşan basit bir metin formatıdır. Bir kullanıcı bilgisini JSON ile ifade etmek şöyle görünür:
{
"ad": "Ahmet",
"yas": 32,
"email": "ahmet@ornek.com",
"aktif": true,
"adres": {
"sehir": "İstanbul",
"ilce": "Kadıköy"
},
"hobiler": ["yüzme", "fotoğrafçılık", "kodlama"]
}
Dikkat edilmesi gereken birkaç nokta var. Anahtarlar mutlaka çift tırnak içinde yazılır — tek tırnak kabul edilmez. Değerler tipine göre değişir: sayılar ve boolean'lar (true, false) tırnaksız, metin değerleri çift tırnak içinde.
İki temel yapı taşı var. Süslü parantez {} nesneleri (object), köşeli parantez [] dizileri (array) tanımlar. Bunları iç içe kullanarak istediğiniz kadar karmaşık veri yapıları oluşturabilirsiniz.
JSON'da hangi veri tipleri var?
JSON altı farklı veri tipini destekler. Bunların dışında bir tip kullanılamaz — bu kısıtlama aslında JSON'un güçlü yanlarından biri, çünkü formatı basit ve öngörülebilir tutar.
| Veri Tipi | Örnek | Açıklama |
|---|---|---|
| String | "merhaba" |
Çift tırnak içinde metin |
| Number | 42, 3.14 |
Tam sayı veya ondalıklı sayı |
| Boolean | true, false |
Mantıksal değer |
| Null | null |
Boş/tanımsız değer |
| Object | {"key": "value"} |
Anahtar-değer çiftleri |
| Array | [1, 2, 3] |
Sıralı değer listesi |
Önemli bir ayrım: tarih (date) tipi yok. Tarihler ISO 8601 formatında string olarak saklanır — "2026-02-11T14:00:00Z" gibi. Fonksiyon, undefined veya yorum satırı da desteklenmez.
Yorum yazamamak özellikle yapılandırma dosyalarında can sıkıcı. Neden mi? Bir tsconfig.json dosyasında neden belirli bir compiler flag'i açtığınızı not düşemiyorsunuz. Bu yüzden bazı projeler JSONC (JSON with Comments) veya YAML'a yöneliyor. Microsoft'un VS Code'u aslında JSONC kullanır — settings.json dosyasında yorum yazabilmenizin sebebi bu.
XML ile arasındaki fark ne?
JSON'dan önce web'de veri taşımanın standart yolu XML'di. SOAP servisleri, RSS beslemeleri, yapılandırma dosyaları — hepsi XML tabanlıydı. 2010'ların başında rüzgar döndü. REST API'ler yaygınlaştıkça JSON, XML'in tahtını devraldı.
Farkı görmek için aynı veriyi iki formatta yazmak yeterli. XML versiyonu:
<kullanici>
<ad>Ahmet</ad>
<yas>32</yas>
<aktif>true</aktif>
</kullanici>
Aynı veri JSON ile:
{
"ad": "Ahmet",
"yas": 32,
"aktif": true
}
Fark açık. XML'de her değer açılış ve kapanış etiketleri arasında yer alır, dosya boyutu kabaca %30-40 şişer. Günde milyonlarca API isteği işleyen bir sistemde bu fark bant genişliği faturasına doğrudan yansır.
XML'in güçlü kaldığı alanlar da var tabii. Veri yapısını XML Schema ile çok detaylı tanımlayabilirsiniz — JSON Schema bunu yapmaya çalışıyor ama XML Schema kadar olgun değil henüz. XSLT ile dönüşüm yapabilirsiniz. Namespace desteği farklı kaynaklardan gelen verileri çakışmadan birleştirir. Bankacılık entegrasyonları, kurumsal sistemler ve legacy altyapılarda XML hâlâ yaygın. Kısacası "JSON her zaman daha iyi" demek doğru olmaz, kullanım senaryosuna bağlı.
Nerelerde kullanılır?
Kullanım alanı düşünüldüğünden çok daha geniş.
API iletişimi
RESTful API'lerin neredeyse tamamı veri alışverişini JSON üzerinden yapar. Hava durumu sorgusu, e-ticaret ürün listesi, sosyal medya entegrasyonu — dönen yanıt JSON formatında gelir. HTTP başlığındaki Content-Type: application/json ifadesi bunu belirtir. GraphQL da aynı şekilde JSON kullanır, sadece sorgu yapısı farklıdır.
Yapılandırma dosyaları
package.json, tsconfig.json, settings.json. Node.js, TypeScript, VS Code — modern geliştirme araçlarının büyük çoğunluğu yapılandırmayı JSON ile yapar. Projenin bağımlılıkları, derleme ayarları, çalışma ortamı hep bu dosyalarda tanımlı. Bir projeye ilk baktığınızda package.json size o proje hakkında çok şey söyler: hangi kütüphaneler kullanılıyor, hangi komutlar tanımlı, minimum Node versiyonu ne.
Veri depolama
NoSQL veritabanları JSON benzeri yapılar kullanır. MongoDB belgeleri BSON (Binary JSON) formatında saklar. Firebase tamamen JSON tabanlı. İlişkisel veritabanları da bu trende ayak uydurdu — PostgreSQL'in jsonb tipi oldukça güçlü, JSON içinde indeksleme ve sorgulama yapabilirsiniz.
Web uygulamaları ve SEO
Tarayıcı ile sunucu arasındaki iletişimde vazgeçilmez. fetch() ile yapılan AJAX çağrılarında veri JSON olarak gidip gelir. localStorage'da karmaşık verileri saklamak mı istiyorsunuz? JSON.stringify() ile serileştirin, okurken JSON.parse() ile geri dönüştürün.
SEO tarafında da JSON kritik bir rol üstleniyor. Arama motorları yapılandırılmış veri için JSON-LD formatını tercih eder. Sayfanızdaki <script type="application/ld+json"> bloklarını Google okur ve içeriğinizi daha iyi anlar — ürün bilgileri, makale detayları, organizasyon verileri hepsi JSON-LD ile tanımlanır ve arama sonuçlarında zengin snippet olarak görünebilir.
Yaygın syntax hataları
Katı syntax kuralları var ve küçük bir hata tüm dosyayı geçersiz kılar.
Tek tırnak kullanımı
// Yanlış
{'ad': 'Ahmet'}
// Doğru
{"ad": "Ahmet"}
JavaScript'te tek tırnak geçerlidir, JSON spesifikasyonu yalnızca çift tırnak kabul eder. Python'dan veya JavaScript'ten geçiş yapanlar bu hataya sık düşer. Editörünüzde otomatik tamamlama tek tırnak koyuyorsa JSON dosyalarında bunu kapatmanız iyi olur.
Sondaki virgül (trailing comma)
// Yanlış
{
"ad": "Ahmet",
"yas": 32,
}
// Doğru
{
"ad": "Ahmet",
"yas": 32
}
Son öğeden sonra virgül bırakmak JavaScript'te sorun çıkarmaz. JSON parser'ları bunu reddeder. Satır ekleyip çıkarırken dikkat etmezseniz bu hataya düşmek çok kolay — özellikle git diff'te yeni satır eklerken önceki satıra virgül eklemeyi unutmak klasik bir senaryo.
Yorum satırı ve tırnaksız anahtar
Ne // ne de /* */ desteklenir. Yapılandırma dosyalarında açıklama eklemek istiyorsanız "_comment" gibi bir anahtar kullanabilirsiniz — resmi bir çözüm değil ama yaygın bir pratik.
Bir diğer tuzak: tırnaksız anahtarlar.
// Yanlış
{ad: "Ahmet"}
// Doğru
{"ad": "Ahmet"}
JavaScript nesnelerinde anahtarlar tırnaksız yazılabilir. JSON'da her anahtar çift tırnak içinde olmalı. Küçük bir fark gibi görünür, dosyanızı geçersiz kılmaya yeter. Bu tür hataları yüzlerce satırlık bir dosyada elle bulmak zor. Hatanın tam konumunu gösteren bir doğrulama aracı kullanmak işi çok kolaylaştırır.
JSON ile çalışırken dikkat edilmesi gerekenler
Güvenlik
Kullanıcıdan gelen JSON verisini doğrudan eval() ile çalıştırmak ciddi bir güvenlik açığı yaratır — eski tarayıcılarda bu yöntem kullanılıyordu, artık hiçbir gerekçesi yok. Her zaman JSON.parse() kullanın. API'den gelen yanıtlarda beklenmeyen alanlar olabilir, veriyi kullanmadan önce yapısını doğrulamak (validation) şart. JSON Schema bu iş için ideal.
Boyut ve performans
Metin tabanlı bir format. Binary alternatiflere göre daha büyük. Yüksek trafikli API'lerde bu fark hissedilir hale gelir.
GZIP veya Brotli ile sıkıştırmak genellikle %60-80 boyut azaltması sağlar — çoğu web sunucusu bunu otomatik yapar, ekstra bir şey yapmanız gerekmez. Protocol Buffers veya MessagePack gibi binary formatlar da bir seçenek ama okunabilirlik avantajını kaybettirirler. Geliştirme aşamasında girintili (beautified) format okunabilirliği artırır, canlı ortamda ise gereksiz boşlukları kaldırmak (minify) mantıklı. Küçük JSON'larda önemsiz gibi görünür ama binlerce API yanıtı düşünüldüğünde toplamda ciddi tasarruf sağlar. Verilerinizi sıkıştırarak farkı doğrudan görebilirsiniz.
Encoding ve büyük dosyalar
Spesifikasyon UTF-8 encoding kullanılmasını önerir. Türkçe karakterler (ş, ç, ğ, ı, ö, ü) UTF-8 ile sorunsuz çalışır. Farklı sistemler arasında veri taşırken encoding uyumsuzlukları yaşanabilir — API yanıtlarında Content-Type: application/json; charset=utf-8 başlığını doğru ayarladığınızdan emin olun.
Peki dosya çok büyükse? Megabaytlarca büyüklüğündeki JSON'u tek seferde parse etmek bellek sorunlarına yol açabilir. Streaming parser'lar veya satır bazlı JSON (JSON Lines / NDJSON) formatı bu sorunu çözer. Her satırda bağımsız bir nesne bulunan NDJSON, büyük veri setlerini parça parça işlemenize olanak tanır. Log dosyaları ve veri pipeline'ları için oldukça pratik bir yaklaşım.
JSON araçları ve ekosistemi
JSON etrafında geniş bir araç ekosistemi oluştu.
JSON Schema, verinin yapısını tanımlayan bir standart. Bir API'nin hangi alanları döndüreceğini, hangilerinin zorunlu olduğunu ve değerlerin hangi tipte olması gerektiğini belirler. OpenAPI (Swagger) spesifikasyonu da bu standart üzerine kuruludur. Özellikle ekip çalışmasında "bu API ne döndürüyor?" sorusuna net bir cevap verir.
JSONPath, büyük yapılar içinde belirli verilere ulaşmak için kullanılan bir sorgu dili — SQL'in JSON karşılığı gibi düşünebilirsiniz. $.kullanicilar[*].ad gibi ifadelerle iç içe yapılardaki verilere kolayca erişirsiniz. 500 satırlık bir API yanıtında tek bir alanı bulmak istediğinizde hayat kurtarır.
Diff araçları iki dosyayı karşılaştırarak farklılıkları gösterir. Format dönüştürme araçları da sık başvurulan bir kategori — veriyi Excel'de açmak istediğinizde JSON-CSV dönüşümü işe yarar. Doğrulama, güzelleştirme, sıkıştırma, karşılaştırma, dönüştürme gibi işlemleri tek bir yerden kolayca yapabilirsiniz.
Altı veri tipi, iki yapısal eleman ve birkaç syntax kuralı. JSON'un tamamı bu kadar. Bu sadelik onu hem insanlar hem makineler için ideal bir format yapıyor. API geliştiriyorsanız, yapılandırma dosyaları yazıyorsanız veya veri analizi yapıyorsanız JSON'la çalışmak kaçınılmaz. Syntax kurallarına dikkat edin, doğru araçları kullanın — gerisini JSON'un kendisi halleder.