Bir haftadan uzun süredir kod yazıyorsan, neredeyse kesinlikle JSON ile karşılaşmışsındır. Her yerde görünür — REST API cevapları, konfigürasyon dosyaları, veritabanı dokümanları, tarayıcı storage'ı, loglar. Peki tam olarak nedir ve neden web'i yutan format haline geldi?

JSON, JavaScript Object Notation'ın kısaltmasıdır. İsmine rağmen tamamen dilden bağımsızdır ve her büyük programlama dilinde kütüphaneleri vardır. Douglas Crockford, 2000'lerin başında tarayıcı–sunucu iletişimi için XML'e daha basit bir alternatif olarak bunu resmileştirdi. Spec aynı zamanda ECMA-404 olarak da standartlaştırılmıştır ve o kadar küçüktür ki bir kartvizite sığar — kazanmasının nedenlerinden biri de budur.

JSON Gerçekte Nasıl Görünür?

İşte bir kullanıcı object'ini temsil eden bir JSON parçası. Bu tek örnek, JSON'un desteklediği altı veri tipinin tamamını kapsıyor:

json
{
  "name": "Alice",
  "age": 30,
  "score": 98.5,
  "active": true,
  "nickname": null,
  "tags": ["developer", "blogger"],
  "address": {
    "city": "Berlin",
    "country": "Germany"
  }
}

JSON'un Altı Veri Tipi

JSON tam olarak altı değer tipini destekler. Hepsi bu. Bu basitlik bir özelliktir — tüm formatı bir öğleden sonrada öğrenebilirsin.

json
{
  "string":  "Hello, world",
  "integer": 42,
  "float":   3.14159,
  "boolean": true,
  "nothing": null,
  "array":   [1, "two", false, null],
  "object":  { "nested": true }
}
  • String — Çift tırnak içindeki herhangi bir metin. "hello", "2024-01-01", "" hepsi geçerli string'lerdir.
  • Number — Integer veya floating point. Int ve float arasında bir ayrım yok. Not: NaN ve Infinity geçerli JSON sayıları değildir.
  • Boolean — Sadece küçük harfle true veya false.
  • Null — "Değer yok" anlamına gelir. Henüz atanmamış opsiyonel alanlar için kullanışlıdır.
  • Array — Sıralı bir değer listesi. Tipleri karıştırabilir: [1, "two", true, null] tamamen geçerlidir.
  • Object — Anahtar–değer çiftlerinin bir kümesi. Anahtarlar mutlaka çift tırnak içinde string olmalıdır.

Gerçek Dünyadan Bir API Cevabı

GET /api/users/42 çağrısında gerçek bir REST API cevabı şöyle görünebilir. Daha zengin veriyi temsil etmek için object'leri ve array'leri nasıl iç içe geçirdiğine dikkat et:

json
{
  "id": 42,
  "username": "alice_dev",
  "email": "[email protected]",
  "createdAt": "2023-06-15T09:30:00Z",
  "preferences": {
    "theme": "dark",
    "notifications": true,
    "language": "en"
  },
  "roles": ["user", "editor"],
  "lastLogin": "2024-01-10T14:22:00Z",
  "stats": {
    "postsPublished": 27,
    "commentsWritten": 154,
    "likesReceived": 489
  }
}

JavaScript'te alice_dev'in tema tercihine user.preferences.theme ile erişebilir veya ilk rolünü user.roles[0] ile alabilirsin. Dil primitive'lerine bu doğal eşleşme, JSON'la çalışmanın neden bu kadar zahmetsiz hissettirdiğinin tam sebebidir.

JSON Sözdizimi Kuralları — Herkesi Yakalayan Tuzaklar

JSON basit görünür ama birkaç katı kuralı vardır. Birini yanlış yap ve tüm payload'un parse edilemez. En sık gördüğüm hatalar şunlar:

  • Anahtarlar çift tırnakla belirtilmelidir. {"name": "Alice"} geçerlidir. {name: "Alice"} değildir. Bu, JavaScript'ten gelen ve tırnak içinde olmayan object anahtarlarına alışık olan geliştiricileri tökezletir.
  • Sonda virgül olmaz. {"a": 1, "b": 2,} parse hatası fırlatır. JavaScript bu konuda müsamahakardır; JSON spec'i değildir.
  • Yorum satırı olmaz. // veya /* */ yorumları JSON'da yoktur. Yorumlu config dosyalarına ihtiyacın varsa YAML veya TOML düşün.
  • undefined yok. JavaScript'in undefined'ı JSON'da mevcut değildir. Eksik değerler için null kullan.
  • String'ler çift tırnak kullanmalıdır. {'key': 'value'} gibi tek tırnaklı string'ler geçersiz JSON'dur.
  • Başta sıfır olmaz. 042 geçersizdir. 42 veya 0.42 sorunsuzdur.
Pro ipucu: Bir yere JSON yapıştırıp parse hatası alıyorsan, suçlu neredeyse her zaman şunlardan biridir: sonda bir virgül, tek tırnaklı anahtarlar veya başıboş bir yorum satırı. Sorunlu satırı tam olarak bulmak için bunu bir JSON Validator'a yapıştır.

JSON Web'i Neden Kazandı

JSON'dan önce XML kraldı. Tipik bir XML API cevabı ayrıntılıydı, düzgün bir XML parser gerektiriyordu ve dile karşı çalışıyor gibi hissettiriyordu. JSON, JavaScript'in yerleşik JSON.parse() fonksiyonuyla parse edilebiliyordu — hiçbir kütüphaneye ihtiyaç yoktu. Ağda daha küçüktü, bir bakışta okunabilirdi ve geliştiricilerin zaten her gün kullandığı object'lere ve array'lere doğrudan eşleşiyordu.

2000'lerin sonlarında çoğu public API, XML'in yanında JSON da sunmaya başladı. 2010'ların başında birçoğu XML desteğini tamamen kaldırdı. Bugün herhangi bir REST API için varsayılan beklenti JSON'dur. REST'in yerini birçok bağlamda alan GraphQL bile cevap formatı olarak hâlâ JSON kullanıyor.

JSON, Desteklemediği Şeylerle de Tanımlanır

JSON'un bazı sınırlamaları, onu basit ve birlikte çalışabilir tutan kasıtlı tasarım tercihleridir:

  • Tarih tipi yok. Tarihler sadece string'dir. Konvansiyon ISO 8601 formatıdır: "2024-01-15T09:30:00Z".
  • İkili (binary) veri yok. Dosyalar ve görüntüler tipik olarak bir string içinde Base64 ile encode edilir.
  • Fonksiyon değerleri yok. {"fn": function(){} } geçersizdir. JSON saf veridir, asla kod değildir.
  • Tekrarlayan anahtar yok. Teknik olarak spec tarafından izin verilse de davranış tanımsızdır. Pratikte parser'lar son değeri alır.

JSON ile Çalışmak için Faydalı Araçlar

JSON ile çalışırken sürekli başvuracağın bazı araçlar: minify edilmiş cevapları düzgün yazdırmak için JSON Formatter, sözdizimi hatalarını bulmak için JSON Validator, üretim için JSON'u sıkıştırmak için JSON Minifier ve döngü yazmadan derinlemesine iç içe veriyi sorgulamak için JSON Path.

Resmi spec json.org üzerinde yaşar ve gerçekten okunmaya değer — yaklaşık 10 dakika sürer ve formatı tamamen anlarsın. Resmi IETF spec'i RFC 8259, bir tartışmayı kapatman gerekirse.

Toparlayalım

JSON, altı değer tipi üzerine inşa edilmiş hafif, insan tarafından okunabilir bir veri formatıdır: string'ler, number'lar, boolean'lar, null, array'ler ve object'ler. Katı sözdizimi kuralları vardır ama onları bir kez öğrendikten sonra sürpriz yoktur. Her yerde olmasının sebebi en güçlü format olması değil — en basit format olması ve gerçek dünya veri ihtiyaçlarının %95'ini karşılaması. Web ile ilgili bir şey inşa ediyorsan, JSON'u anlamak opsiyonel değildir. Temeldir.