JSON (JavaScript Object Notation), verileri depolamak ve sistemler arasında transfer etmek için kullanılan hafif, metin tabanlı bir veri formatıdır. Douglas Crockford tarafından 2000'lerin başında popüler hale getirilen JSON, başlangıçta JavaScript'in bir alt kümesi olarak düşünülse de, bugün dilden bağımsız bir standart (RFC 8259) haline gelmiştir. XML'in hantal ve okunması zor yapısına bir alternatif olarak doğan JSON, hem insanlar tarafından kolay okunabilir olması hem de makineler tarafından çok hızlı parse edilebilmesi sayesinde modern web'in "lingua franca"sı olmuştur. Günümüzde REST API'lerden konfigürasyon dosyalarına, NoSQL veritabanlarından mikroservis iletişimine kadar her alanda JSON hakimiyeti vardır. Basitliği, anahtar-değer (key-value) çiftlerine dayanmasından gelir.
JSON'un katı sözdizimi kuralları, verinin tutarlılığını sağlar. Bir JSON verisi mutlaka süslü parantez { } veya köşeli parantez [ ] ile başlamalıdır. Anahtar isimleri her zaman çift tırnak içinde yazılmalıdır. Desteklediği temel veri tipleri şunlardır: String, Number (tam sayı veya ondalıklı), Boolean (true/false), Array (diziler), Object (nesneler) ve Null. JavaScript nesnelerinin aksine, JSON içinde fonksiyonlar, undefined değerler veya yorum satırları bulunamaz. Bu kısıtlamalar, verinin her dilde (Python, Java, Go vb.) aynı şekilde yorumlanabilmesini garanti eder. Sayısal değerlerde bilimsel gösterim (örn: 1.2e10) desteklenirken, tarih (Date) tipi için standart bir JSON tipi yoktur; tarihler genellikle ISO 8601 formatında string olarak taşınır.
Web uygulamalarında veri genellikle "nesne" halindedir, ancak ağ üzerinden gönderilmek için "metin" (string) haline getirilmesi gerekir. Bu işleme Serileştirme (Serialization) denir. JavaScript'te JSON.stringify() metodu bu işi yapar. Gelen metni tekrar programın anlayacağı bir nesneye dönüştürme işlemine ise Ayrıştırma (Parsing) denir ve JSON.parse() ile gerçekleştirilir. Bu işlemler sırasında hata yönetimi kritiktir; çünkü hatalı bir JSON metni programın çökmesine neden olabilir. Modern tarayıcılar bu işlemleri çok hızlı yapan yerleşik motorlara sahiptir. İleri seviye kullanımda, stringify metoduna "replacer" parametresi ekleyerek hangi alanların serileştirileceğini seçebilir veya parse sırasında "reviver" kullanarak veriyi anında manipüle edebilirsiniz.
JSON ve XML arasındaki temel fark, JSON'un veri odaklı, XML'in ise döküman odaklı olmasıdır. XML, hiyerarşik yapısı ve şema desteğiyle karmaşık dökümanlar için güçlüyken, JSON daha az karakter kullanarak daha az bant genişliği tüketir. JSON'un veri tiplerini (sayı, dizi vb.) doğrudan tanıması, programlama dillerindeki veri yapılarıyla doğrudan eşleşmesini sağlar; XML'de her şey bir string'dir ve dönüştürme işlemi ek yük getirir. AJAX teknolojisinin ilk zamanlarında XML popüler olsa da, mobil uygulamaların yükselişiyle veri boyutu kritik hale gelmiş ve JSON bu savaşı kazanmıştır. JSON'da hiyerarşi diziler ve iç içe nesnelerle kurulurken, XML'de etiketler (tags) kullanılır. Hız ve hafiflik gerektiren her noktada JSON mutlak galiptir.
JSON esnek bir formattır, ancak büyük projelerde bu esneklik bir risk oluşturabilir. Bir API'den gelen verinin beklenen formatta (örn: "email" alanı mutlaka olmalı ve bir string olmalı) olup olmadığını kontrol etmek için JSON Schema kullanılır. JSON Schema, bir JSON dökümanının yapısını tanımlayan bir standarttır. Verinin tipini, zorunlu alanlarını, sayısal sınırlarını ve düzenli ifadelerle (regex) formatını doğrular. Bu işlem, sunucu tarafında hatalı veri işlenmesini önlerken, istemci tarafında da form doğrulamalarını kolaylaştırır. Özellikle mikroservisler arası iletişimde, servislerin birbirine gönderdiği verilerin "sözleşmeye" (contract) uygunluğunu test etmek için JSON Schema vazgeçilmez bir araçtır.
Modern web'in temeli olan asenkron veri transferi, JSON ile hayat bulur. Fetch API, sunucudan JSON verisi çekmek için kullanılan en modern standarttır. Bir fetch() isteği yapıldığında, gelen yanıt (response) önce bir stream halindedir ve .json() metoduyla JavaScript nesnesine dönüştürülür. Bu süreç Promise tabanlıdır ve async/await yapısıyla çok temiz bir şekilde yönetilebilir. Hata yönetiminde sadece ağ hatalarını değil, sunucudan gelen hatalı JSON formatlarını da try/catch bloklarıyla yakalamak gerekir. Header kısmında 'Content-Type': 'application/json' belirtilmesi, sunucunun gelen veriyi nasıl işleyeceğini bilmesi açısından zorunludur. JSON, modern frontend framework'lerinin (React, Vue) state yönetimindeki ana veri kaynağıdır.
JSON, sadece veri taşımakla kalmaz, kimlik doğrulama (authentication) süreçlerinde de merkezi bir rol oynar. JSON Web Token (JWT), kullanıcı bilgilerini güvenli bir şekilde taşımak için kullanılan JSON tabanlı bir standarttır. Üç parçadan oluşur: Header, Payload ve Signature. Payload kısmı kullanıcı ID'si, yetkiler ve son kullanma tarihi gibi verileri JSON formatında tutar. JWT'nin en büyük avantajı "stateless" olmasıdır; yani sunucu kullanıcı oturumlarını hafızasında tutmak zorunda kalmaz, sadece token üzerindeki imzayı kontrol eder. Ancak JSON verisi base64 ile kodlandığı için şifreli değildir; sadece imzalanmıştır. Bu yüzden payload içine asla şifre veya kredi kartı gibi hassas veriler koyulmamalıdır. Token'lar her zaman HTTPS üzerinden iletilmelidir.
MongoDB, CouchDB gibi NoSQL veritabanları, verileri JSON benzeri (BSON) dökümanlar olarak saklar. Geleneksel ilişkisel veritabanlarının (SQL) aksine, bir tablo yapısı veya katı bir şema zorunluluğu yoktur. Bu durum, veri yapısı sık değişen uygulamalar için büyük esneklik sağlar. Veritabanına bir JavaScript nesnesini doğrudan kaydetmek ve aynı şekilde geri çekmek, "Object-Relational Mapping" (ORM) karmaşıklığını ortadan kaldırır. JSON tabanlı dökümanlarda iç içe (nested) yapılar kullanılarak, ilişkili veriler tek bir dökümanda saklanabilir. Bu, okuma işlemlerinde "Join" ihtiyacını azaltarak performansı artırır. Modern SQL veritabanları (PostgreSQL, MySQL) bile artık JSON veri tipini ve JSON içi sorgulama yeteneklerini desteklemektedir.
Büyük veri setleri söz konusu olduğunda, JSON'un okunabilirliği bir dezavantaja dönüşebilir; çünkü her veri parçası için anahtar isimleri tekrar edilir. Bu, dosya boyutunu artırır. Optimizasyon için Gzip veya Brotli gibi sıkıştırma algoritmaları kullanılır. Ayrıca veri transferini hızlandırmak için gereksiz boşlukların silindiği "Minification" işlemi uygulanır. Çok büyük veri setleri (gigabaytlarca) tek seferde parse edilmeye çalışıldığında tarayıcıyı dondurabilir. Bu durumlarda "Streaming JSON Parser" yapıları kullanılarak veri parça parça işlenir. Alternatif olarak, performansın çok kritik olduğu (mobil oyunlar vb.) yerlerde Binary JSON (BSON) veya MessagePack gibi formatlar tercih edilerek verinin boyutu küçültülürken parse hızı artırılabilir.
JSON ile çalışırken en sık karşılaşılan sorunlar; eksik bir tırnak işareti, fazladan bir virgül veya yanlış parantez kullanımıdır. Bu hataları ayıklamak için "JSON Lint" gibi doğrulama araçları kullanılır. Chrome DevTools'un "Network" sekmesi, giden ve gelen JSON paketlerini incelemek, formatlamak ve filtrelemek için mükemmel bir ortam sunar. Geliştirme sürecinde karmaşık yapıdaki JSON verilerini daha iyi anlamak için "JSON Tree Viewers" kullanılır. Ayrıca Mock API araçları (JSON Server gibi), gerçek bir backend yazmadan önce sadece bir JSON dosyası üzerinden tam fonksiyonel bir REST API oluşturmanıza olanak tanır. İyi bir JSON yönetimi, verinin sadece doğru taşınmasını değil, aynı zamanda geliştirici ekipler arasındaki iletişimin de sağlıklı yürümesini sağlar.