JSON Nedir? Sözdizimi Kuralları ve Hata Çözümleri
JSON (JavaScript Object Notation), verileri metin olarak temsil etmek için kullanılan hafif bir format. İki tür yapı üzerine kurulu: anahtar-değer çiftlerinden oluşan nesneler ve sıralı değer listeleri olan diziler. Neredeyse her programlama dili bunu okuyup yazabildiği için API’ler, yapılandırma dosyaları ve veritabanları arasında verinin ortak dili hâline geldi.
JSON gerçekte nedir
JSON’da yalnızca altı değer tipi var: string (yalnızca çift tırnakla), sayı, boolean (true veya false), null, nesne ({}) ve dizi ([]). Başka hiçbir tip yok; tarih, fonksiyon veya özel bir sınıf gibi şeyler bu altı tipin dışına çıkamaz, dolayısıyla bir tarihi genelde string olarak ("2026-07-12") yazarsınız.
Format birkaç katı kural dayatıyor; deneme yanılmayla öğrenilen hataların çoğu tam da bu kurallardan kaynaklanıyor:
- Nesne anahtarları her zaman çift tırnaklı string olmalı.
`{"ad":"Ada"}`geçerli,`{ad:"Ada"}`değil. - Son elemandan veya son özellikten sonra virgül bırakılamaz (sondaki virgül yasak).
- Hiçbir türde yorum satırı desteklenmiyor, ne
//ne de/* */. - String ve anahtarlar yalnızca çift tırnak kullanır, tek tırnak asla kabul edilmez.
- Anahtarlar hiçbir koşulda tırnaksız bırakılamaz.
NaN,Infinityveundefinedgeçerli JSON değerleri değil.- Fonksiyonlar JSON içinde hiçbir şekilde temsil edilemez.
Bu kurallar keyfi değil: JSON’un tasarım amacı, herhangi bir dildeki bir ayrıştırıcının veriyi tek ve öngörülebilir bir şekilde okuyabilmesi. Kural ne kadar az esnekse, o kadar az yorum farkı çıkar, ve farklı diller aynı JSON dosyasını her seferinde aynı şekilde okur.
JSON ile JavaScript nesne değişmezinin karşılaştırılması
JSON, JavaScript’in nesne söz dizimine görsel olarak çok benziyor, ve kafa karışıklığının büyük kısmı tam olarak buradan çıkıyor: ikisi aynı yapıyı paylaşsa da aynı kurallara sahip değil. JavaScript kodunuzda geçerli olan bir nesne değişmezini olduğu gibi bir JSON dosyasına kopyalayıp yapıştırdığınızda, ayrıştırıcı genelde bunu reddeder.
| Özellik | JSON | JavaScript nesne değişmezi |
|---|---|---|
| Anahtarlar tırnaklı olmalı | Evet, yalnızca çift tırnak | Hayır, tırnak isteğe bağlı |
| Sondaki virgüle izin var mı | Hayır | Evet |
| Yorum satırına izin var mı | Hayır | Evet |
| Tek tırnaklı string | Hayır | Evet |
| Fonksiyon değer olarak | Hayır | Evet |
undefined değer olarak | Hayır | Evet |
Bu fark özellikle bir geliştirici JavaScript’te elle bir yapılandırma nesnesi yazıp sonra onu .json uzantılı bir dosyaya taşıdığında sorun çıkarıyor. Kodda gayet doğal duran tırnaksız anahtarlar, sondaki virgül veya bir yorum satırı, JSON dosyasına geçtiği anda ayrıştırma hatasına dönüşüyor. JSON bilerek JavaScript’ten daha kısıtlayıcı tasarlandı, çünkü amacı bir programlama dili değil, bir veri değişim formatı olmak.
Uygulamalı örnek: gerçek bir API yanıtını küçültme ve biçimlendirme
Bir API’nin genelde döndürdüğü türden, tek satırlık ve küçültülmüş (minified) bir kullanıcı nesnesine bakalım:
{"id":1,"name":"Ada Lovelace","email":"[email protected]","roles":["admin","user"],"active":true,"meta":null}
Bu string tam olarak 107 karakter. API’ler yanıtlarını genelde bu haliyle, hiçbir gereksiz boşluk olmadan gönderiyor, çünkü her sunucu talebinde binlerce (bazen milyonlarca) kez tekrarlanan bir yükte her bayt ağ üzerinden taşınan veri miktarını etkiliyor.
Aynı nesneyi 2 boşluklu girintiyle biçimlendirdiğinizde şu hâle geliyor:
{
"id": 1,
"name": "Ada Lovelace",
"email": "[email protected]",
"roles": [
"admin",
"user"
],
"active": true,
"meta": null
}
Bu sürüm 145 karakter, yani sırf eklenen boşluk ve satır sonlarından dolayı küçültülmüş hâlinden yaklaşık yüzde 35 daha uzun. İşte tam olarak burada işbölümü netleşiyor: API’ler telden küçültülmüş JSON gönderiyor çünkü boşluk hiçbir anlam taşımıyor ve sadece bayt israf ediyor, ama bir geliştirici o yanıtı okumaya oturduğunda önce onu biçimlendiriyor, çünkü iç içe geçmiş nesneleri ve dizileri tek satırda takip etmek pratikte imkânsız. İkisi de aynı veri, sadece amaca göre farklı bir gösterim.
Kendi JSON’unuzu biçimlendirin
Aşağıdaki araca kendi JSON’unuzu yapıştırın, biçimlendirilmiş ve girintili hâlini anında görün, sözdizimi hataları varsa nerede olduğunu öğrenin.
Yaygın hatalar ve uç durumlar
Sondaki fazladan virgül. `{"id":1,"name":"Ada",}` girdisini bir tarayıcıda JSON.parse ile ayrıştırmayı denediğinizde şu hatayı alırsınız: Expected double-quoted property name in JSON at position 21 (line 1 column 22). Ayrıştırıcı son virgülden sonra yeni bir özellik adı bekliyor ama bulamıyor, } ile karşılaşıyor ve orada duruyor.
Tırnaksız anahtar. `{id:1}` yazdığınızda hata şu: Expected property name or '}' in JSON at position 1 (line 1 column 2). JSON, JavaScript’in aksine, anahtarın tırnaksız yazılmasına hiçbir koşulda izin vermiyor.
Tek tırnaklı anahtar. `{'a':1}` da aynı hata sınıfını üretiyor: Expected property name or '}' in JSON at position 1 (line 1 column 2). Ayrıştırıcı tek tırnağı bir anahtar adının başlangıcı olarak tanımıyor, çünkü JSON yalnızca çift tırnağı geçerli kabul ediyor.
NaN bir değer olarak. `{"a":NaN}` girdisi şu hatayı veriyor: Unexpected token 'N', "{"a":NaN}" is not valid JSON. JavaScript’te NaN geçerli bir sayısal değerken, JSON’un altı tipi arasında yer almıyor.
undefined bir değer olarak. `{"a":undefined}` girdisi de benzer şekilde başarısız oluyor: Unexpected token 'u', "{"a":undefined}" is not valid JSON. JavaScript nesnelerinde bir özelliğe undefined atamak son derece yaygın, ama JSON’a serileştirildiğinde bu özellik tamamen kayboluyor (yoksayılıyor), string olarak yazmaya çalıştığınızda ise ayrıştırma hatasına dönüşüyor.
Bu beş hatanın tam metni tarayıcıdan tarayıcıya biraz değişebilir (Firefox’un motoru SpiderMonkey, hataları Chrome’un V8’inden farklı ifadelerle raporluyor), ama ayrıştırmanın başarısız olma nedeni her zaman aynı kalıyor: JSON’un altı katı kuralından biri ihlal edilmiş oluyor.
Sessiz bir tuzak: yinelenen anahtarlar. `{"a":1,"a":2}` yazmak hiçbir hata üretmiyor, tamamen geçerli bir JSON olarak ayrıştırılıyor ve sonuç `{"a":2}` oluyor. JavaScript dahil çoğu ayrıştırıcı, aynı anahtar birden fazla kez göründüğünde sessizce sonuncusunu tutuyor ve öncekileri atıyor. Bu, elle düzenlenen bir yapılandırma dosyasında veya bir derleme aracının ürettiği çıktıda aynı anahtarın yanlışlıkla iki kez yazılıp fark edilmemesi gibi gerçek dünya hatalarının sinsi bir kaynağı, çünkü hiçbir hata mesajı sizi uyarmıyor.
Sıkça sorulan sorular
JSON nedir?
JSON, verileri düz metin olarak temsil etmek için kullanılan hafif bir format. Anahtar-değer çiftlerinden oluşan nesneleri ve sıralı değerlerden oluşan dizileri destekler; altı değer tipi var: string, sayı, boolean, null, nesne ve dizi.
JSON bir JavaScript nesnesiyle aynı mı?
Hayır. JSON, JavaScript’in nesne söz dizimine benziyor ama daha katı kurallara sahip: anahtarlar her zaman çift tırnaklı olmalı, sondaki virgüle izin yok, yorum satırı yok, tek tırnak yok, fonksiyon değer olarak yazılamaz ve undefined geçerli bir değer değil. JavaScript’te geçerli olan bir nesne değişmezi, bu kısıtlamalardan biri yüzünden JSON olarak reddedilebilir.
Sondaki fazladan virgül neden JSON’umu bozuyor?
Çünkü JSON, JavaScript’in aksine son elemandan sonra ek bir virgüle izin vermiyor. `{"id":1,"name":"Ada",}` gibi bir girdi, ayrıştırıcının virgülden sonra yeni bir özellik adı beklemesine ama bulamamasına yol açıyor ve Expected double-quoted property name in JSON at position 21 (line 1 column 22) hatasını üretiyor.
JSON yorum satırlarını destekliyor mu?
Hayır, hiçbir şekilde. Ne // ne de /* */ biçimindeki yorumlar JSON’da geçerli değil. Bu, formatın en sık şaşırtan kısıtlamalarından biri, çünkü çoğu yapılandırma dosyası formatı (YAML gibi) yorum satırına izin veriyor.
Biçimlendirme ile küçültme arasındaki fark ne? Biçimlendirme, boşluk ve girinti ekleyerek JSON’u insan gözüyle okunabilir hâle getiriyor; küçültme ise tam tersini yapıp tüm gereksiz boşlukları kaldırarak veriyi mümkün olan en kısa string’e indiriyor. Örneğin yukarıdaki kullanıcı nesnesi biçimlendirilmiş hâlde 145 karakter, küçültülmüş hâlde ise 107 karakter; API’ler bant genişliğinden tasarruf etmek için küçültülmüş sürümü, geliştiriciler ise okumak için biçimlendirilmiş sürümü kullanıyor.
Çevrimiçi bir biçimlendirici kullanırken verilerim bir sunucuya gönderiliyor mu?
pluri.tools’un JSON biçimlendiricisinde hayır. Tüm biçimlendirme ve doğrulama işlemi, tarayıcınızda çalışan düz JavaScript ile JSON.parse ve JSON.stringify üzerinden gerçekleşiyor; hiçbir ağ isteği yapılmıyor. Yapıştırdığınız JSON cihazınızdan hiç çıkmıyor.