Douglas Crockford'ın JSON'u nasıl popülerleştirdiği ve neden web uygulamaları ve API'ler için varsayılan dil haline geldiği — ayrıca bugün JSON'u doğru kullanmak için pratik ipuçları.

JSON (JavaScript Object Notation), anahtar–değer çiftleri ve listeler kullanarak veriyi düz metin halinde temsil etmenin hafif bir yoludur.
Web uygulamaları geliştiriyorsanız — “veri formatları” üzerine çok düşünmüyor olsanız bile — JSON muhtemelen ürününüzü bir arada tutan yapıştırıcıdır. Frontend'in veri isteme şekli, backend'in cevap verme biçimi, mobil uygulamaların durum senkronizasyonu ve üçüncü taraf hizmetlerin olay göndermesi genellikle JSON ile olur. JSON açık ve tutarlı olduğunda ekipler daha hızlı teslim eder; karışıksa her özellik daha uzun sürer çünkü herkes verinin “ne anlama geldiği” konusunda tartışır.
Hemen görebileceğiniz küçük bir JSON nesnesi:
{
"userId": 42,
"name": "Sam",
"isPro": true,
"tags": ["beta", "newsletter"]
}
Teknik bağlam olmasa bile, genellikle ne olduğunu çıkarabilirsiniz: bir kullanıcının ID'si, adı, bir durum bayrağı ve etiket listesi var.
Şunları öğreneceksiniz:
Amaç basit: JSON'un ne olduğunu anlamanıza yardımcı olmak değil sadece, neredeyse her uygulamanın neden “onunla konuştuğunu” ve ekiplerin tekrarladığı yaygın hatalardan nasıl kaçınacağınızı göstermek.
Douglas Crockford, JSON'un arkasındaki her fikri “icat” etmedi, fakat aynı derecede önemli bir şeyi yaptı: basit ve işe yarar bir deseni görünür kıldı, adlandırdı ve anaakım haline getirdi.
Web uygulamalarının ilk dönemlerinde, tarayıcı ile sunucu arasında veri taşımak için ekipler hantal seçeneklerle uğraşıyordu. XML yaygındı ama ayrıntılıydı. Özel ayırıcı tabanlı formatlar kompakt ama kırılgandı. JavaScript teknik olarak veriyi kod olarak değerlendirebilirdi, ancak bu “veri” ile “çalıştırılabilir betik” arasındaki çizgiyi bulanıklaştırıyordu; bu da hata ve güvenlik sorunlarına yol açabilirdi.
Crockford daha temiz bir yol gördü: düz veriyi güvenilir şekilde temsil edebilecek JavaScript literal sözdiziminin küçük bir alt kümesini kullanmak—nesneler, diziler, stringler, sayılar, boolean'lar ve null—ekstra özellikler olmadan.
Crockford'ın en büyük katkılarından biri teknik değil, sosyaldir: buna JSON (JavaScript Object Notation) adını verdi ve json.org'da net bir dokümantasyon yayınladı. Bu, ekiplerin ortak bir sözlüğe sahip olmasını sağladı ("JSON göndereceğiz") ve okunması kısa ama uygulanması katı bir referans sundu.
Ayrıca JSON'u bir programlama dilinden bağımsız veri formatı olarak tanıttı: birçok dil bunu ayrıştırıp üretebiliyordu ve yaygın veri yapılarına doğal şekilde eşleniyordu.
Benimseme, ekiplerin uzun vadede bir formata güven hissi duyduğunda hızlanır. JSON, şu yaygın kilometre taşlarıyla “güvenli bahis” statüsünü yavaşça kazandı:
Crockford'un savunuculuğu, bu standartlar ve genişleyen ayrıştırıcı ekosistemi, JSON'un kullanışlı bir uygulama halinden istemciler arasında varsayılan konuşma biçimine—özellikle HTTP API'leri arasında—dönmesine yardımcı oldu (daha sonra blog'da json-and-apis başlıklı yazıda ele alınacak).
JSON varsayılan hale gelmeden önce web, ya çok ağır ya tutarsız ya da ekipler arasında ölçeklenmesi zor bir dizi formatla çalışıyordu.
XML büyük "standart" seçimdi. Diller arası çalışıyor, araçlar vardı ve iç içe geçmiş yapıları temsil edebiliyordu. Ancak beraberinde çok fazla tören getirdi.
Aynı zamanda birçok uygulama veriyi özel sorgu dizeleri olarak geçiriyordu (özellikle erken AJAX tarzı isteklerde): URL'lere veya POST gövdelerine sıkıştırılmış anahtar/değer çiftleri. Diğerleri ise el yapımı metin formatları icat etti—burada virgülle ayrılmış liste, orada boru ile ayrılmış blob—genellikle sadece bir geliştiricinin anladığı elle yazılmış kaçış kurallarıyla.
Yaygın problemler teorik değildi:
Çoğu uygulama her belge yapısını ifade edebilecek bir formata ihtiyaç duymaz. Nesneleri, dizileri, stringleri, sayıları ve boolean'ları hızlı, tutarlı ve yorumlama için az yer bırakarak göndermeye ihtiyaç duyarlar. Daha basit formatlar, uç nokta başına yapılan karar (ve hata) sayısını azaltır.
<user>
<id>42</id>
<name>Ada</name>
<isActive>true</isActive>
</user>
{
"id": 42,
"name": "Ada",
"isActive": true
}
Her ikisi aynı fikri ifade eder, ama JSON taranması, üretimi ve çoğu uygulamanın bellekte veriyi modellama biçimine yakın olması bakımından daha kolaydır.
JSON'un kalıcılığı tesadüf değil. Gerçek uygulama verisini temsil etmek için yeterince ama aşırıya kaçmayacak şekilde kasıtlı olarak küçük tutuldu.
JSON size çoğu uygulamanın veri düşünme biçimine temizce eşlenen minimal bir araç takımı sunar:
name, email gibi)true/falseHepsi bu. Tarihler yok, yorumlar yok, özel sayısal tipler yok, referanslar yok. Bu sadelik JSON'u diller ve platformlar arasında uygulamayı kolaylaştırır.
JSON, günlüklerde ve API yanıtlarında insanların tarayabileceği kadar okunabilirken, makinelerin hızlıca ayrıştırabileceği kadar da düzenlidir. Ek törenlerden kaçınır ama ayrıştırıcıların hızlı ve güvenilir olması için net sınırlayıcılar ({}, [], :) korur.
Takas: JSON çok minimal olduğu için zaman damgaları, para birimi ve kimlikler gibi konularda ekiplerin konvansiyonlarda anlaşması gerekir (örneğin tarihler için ISO-8601 stringleri).
JSON'un katı kuralları (çift tırnaklı stringler, sonlandırıcı virgüllerin olmaması, sınırlı tip seti) belirsizliği azaltır. Daha az belirsizlik, farklı sistemlerin veri alışverişinde "makinemde çalışıyor" hatalarının azalması demektir.
JSON JavaScript nesne sözdizimine benzer görünüyor, ama JSON JavaScript değildir. Kendi kuralları olan, dil bağımsız bir veri formatıdır; Python, Java, Go, Ruby ve tutarlı serileştirme ve birlikte işlerlik gerektiği her yerde kullanılabilir.
JSON, en özellikli format olduğu için kazanmadı. Kazandı çünkü web uygulamalarının zaten inşa edildiği biçime uydu: JavaScript ağırlıklı bir tarayıcı basit HTTP istekleri üzerinden bir sunucu ile konuşuyordu.
Tarayıcılar JavaScript etrafında standartlaştıkça, istemci tarafı yapılandırılmış veriyi temsil etmenin yerleşik bir yoluna sahip oldu: nesneler, diziler, stringler, sayılar, boolean'lar ve null. JSON bu ilkelere yakın şekilde eşleniyordu, böylece tarayıcının anladığı ile sunucunun gönderdiği veri arasındaki geçiş doğal hissettirdi.
Erken Ajax tarzı uygulamalar bunu hızlandırdı. Sunucular tam HTML sayfaları döndürmek yerine, UI'ın render etmesi için küçük bir yük döndürebiliyordu. Bu tür bir yanıt hemen işe yarardı:
{
"user": {"id": 42, "name": "Sam"},
"unreadCount": 3
}
JSON'un sözdizimi JavaScript'e benzese de, dil tarafsızdır. Sunucular ve diğer dillerdeki istemciler web front-end'leriyle birlikte çalışmaya ihtiyaç duyduğunda JSON kütüphaneleri ortaya çıktı—ve hızla "standart ekipman" haline geldi. Bir JSON string'ini yerel veri yapılarına ayrıştırmak genellikle bir fonksiyon çağrısıdır; JSON üretmek de aynı şekilde basittir.
Framework'ler, API istemcileri, hata ayıklayıcılar, proxy'ler ve dokümantasyon araçları JSON'u varsaydığında başka bir şey seçmek sürtünme yarattı. Geliştiriciler tarayıcı geliştirici araçlarında yükleri inceleyebildi, testlere örnekleri kopyala-yapıştır yapabildi ve kodlama/döndürme hataları için olgun kütüphanelere güvenebildi.
Tek bir JSON yanıtı web UI, mobil uygulama, dahili servis ve üçüncü taraf entegrasyonu için minimal değişiklikle hizmet edebilir. Bu birlikte çalışabilirlik, ekiplerin "bir backend, birçok frontend" kurarken JSON'u güvenli bir tercih haline getirdi.
JSON, gösterişli olduğu için kazanmadı—web'in zaten işlediği biçime güzelce uydu. HTTP, bir istekte bulunup yanıt alma etrafında kuruludur ve JSON, bu yanıtın (veya isteğin) gövdesini yapılandırılmış veri olarak temsil etmek için kolay, öngörülebilir bir yoldur.
Bir API isteği genellikle bir yöntem ve URL içerir (örneğin GET /users?limit=20). Sunucu bir durum kodu (200 veya 404 gibi), başlıklar ve isteğe bağlı bir gövde ile cevap verir.
Gövde JSON olduğunda, anahtar başlıklardan biri:
Content-Type: application/jsonBu başlık istemcilere aldıkları byte'ları nasıl yorumlayacaklarını söyler. Gitgide (istemci → sunucu) Content-Type: application/json göndermek "JSON gönderiyorum" sinyali verir ve sunucular bunu tutarlı şekilde ayrıştırabilir.
JSON, birçok API'de görülen tekrar eden desenler için özellikle uygundur.
Sayfalandırma genellikle bir listeyi meta verilerle sarar:
{
"data": [{"id": 1, "name": "A"}],
"pagination": {"limit": 20, "offset": 0, "total": 153}
}
Filtreleme ve sıralama tipik olarak URL sorgu dizesinde yapılır, sonuçlar ise JSON dizisi (veya data alanı) halinde kalır. Örneğin: GET /orders?status=paid&sort=-created_at.
Hata yanıtları, istemcilerin mesajları göstermesi ve yeniden denemeleri yönetmesi için standart bir şekilden faydalanır:
{
"error": {
"code": "invalid_request",
"message": "limit must be between 1 and 100",
"details": {"field": "limit"}
}
}
Pratik eşleşme basit: HTTP teslimat ve anlam (metotlar, durum kodları, önbellekleme) sağlar, JSON ise verinin kendisi için hafif, insanın okuyabileceği bir yapı sunar.
İnsanlar JSON ve XML'i karşılaştırdıklarında çoğunlukla "uygulama verisi" ile "belge verisi"yi karşılaştırıyorlar. Her iki format da yapılandırılmış bilgiyi temsil edebilir, ama JSON çoğu uygulamanın gerçekte taşıdığı şeylerle daha iyi eşleşir: basit nesneler, listeler, stringler, sayılar, booleanlar ve null.
XML tasarımdan ötürü kelime sayısı fazladır. Açılış ve kapanış etiketlerini tekrarlamak yükleri daha büyük ve günlüklerde veya ağ denetleyicilerinde taraması zor hale getirir. JSON genellikle aynı anlamı daha az karakter ve daha az görsel karmaşa ile iletir; bu hata ayıklamayı kolaylaştırır ve ölçeklendiğinde bant genişliği maliyetlerini azaltabilir.
Bu sadece estetik değil: daha küçük yükler genellikle daha hızlı transfer ve ayrıştırıcılar/proxy'ler için daha az iş demektir.
Çoğu uygulama verisi doğal olarak sözlükler (anahtar/değer haritaları) ve diziler (listeler) gibi görünür: özellikleri olan bir kullanıcı, satır öğeleri olan bir sipariş, bileşenleri olan bir sayfa. JSON bu zihinsel modele doğrudan karşılık gelir ve JavaScript ile çoğu modern dildeki yerel veri yapılarına uyar.
XML aynı yapıları temsil edebilir, ama genellikle konvansiyonlar gerektirir: öznitelikler vs elemanlar, listeler için tekrarlanan alt elemanlar ve "neyin sayı sayıldığı" gibi ek kurallar.
XML belge merkezli kullanım örneklerinde güçlü kalır: iç içe geçmiş işaretleme ile karışık içerik, yayın iş akışları ve olgun XML araç setine sahip ekosistemler (ör. bazı kurumsal entegrasyonlar). Eğer yükünüz bir belgeden daha çok bir nesne grafiğine benziyorsa JSON genelde daha iyi bir seçimdir.
Öncelikli hedefiniz frontend, backend ve API'ler arasında uygulama verisi alışverişiyse, JSON genellikle daha basit ve doğrudan tercihtir. Belge işaretlemesine ihtiyacınız varsa, karışık içerik gerekiyorsa veya XML ağırlıklı bir alana entegre oluyorsanız, XML daha uygun olabilir.
JSON "JavaScript nesneleri" gibi göründüğü için ekipler genellikle onunla JavaScript gibi muamele edilebileceğini varsayar. İşte hataların sızdığı yer: JSON daha katıdır, daha küçüktür ve daha az hoşgörülüdür.
Tekrar eden "makinemde çalışıyor" sorunları şunlardır:
{name: "Ada"} JSON değil; { "name": "Ada" } JSON'dur.{ "a": 1, } birçok ayrıştırıcıda hata verir.// ve /* ... */ geçersizdir. Notlara ihtiyacınız varsa dokümantasyonda tutun ya da geliştirme sırasında dikkatli şekilde ayrı bir alan kullanın.Bu kısıtlamalar kasıtlıdır: ayrıştırıcıları dilleri arasında basit ve tutarlı tutar.
JSON'da tek bir sayısal tür vardır: number. Yerleşik integer, ondalık ya da tarih yoktur.
"19.99")."2025-12-26T10:15:30Z"). Özel tarih formatlarından kaçının.JSON Unicode'dur, ama gerçek sistemler hâlâ kodlama ve kaçış konusunda tökezler:
" ve ters eğik çizgiler \\).Her zaman gerçek bir JSON ayrıştırıcısı ile ayrıştırın (JSON.parse veya dilinizin eşdeğeri). Hızlı görünse bile eval tarzı yaklaşımlardan kaçının. Ve beklenmeyen alanlar veya türler iş mantığına sızmasın diye özellikle halka açık API'lerde kenarlarda doğrulama yapın.
Bir JSON yükü sadece "taşınan veri" değildir—takımlar, sistemler ve gelecekteki siz için uzun vadeli bir arayüzdür. Uzun ömürlü bir yük ile her çeyrekte yeniden yazılan bir yük arasındaki fark genellikle sıkıcı disiplinlerdedir: tutarlılık, dikkatli değişiklik yönetimi ve öngörülebilir kenar durumları.
Adlandırma kuralları seçin ve her yerde buna sadık kalın:
camelCase veya snake_case) ve karıştırmayın.userId'yi id yapmak, anlamı “açık” olsa bile kırıcı bir değişikliktir."count": 3 vs "count": "3") izlemesi zor hatalara yol açar.Çoğu versiyon savaşından kaçınmak için değişiklikleri ekleyici yapın:
/v2/...) veya bir başlıkta net bir versiyon sinyali verin—semantik olarak gizli değişiklik yapmayın.İstemciler hataları en iyi şu şekliyle yönetirler:
{
"error": {
"code": "INVALID_ARGUMENT",
"message": "email must be a valid address",
"details": { "field": "email" }
}
}
Harika JSON dokümanları gerçek örnekler—başarılı ve başarısız yanıtlarla birlikte—içerir. Örnekleri üretim davranışıyla senkronize tutun ve hangi alanların isteğe bağlı, nullable veya kullanımdan kaldırılmış olduğunu açıkça belirtin. Gerçek örnekler üretimle eşleştiğinde entegrasyonlar daha hızlı olur ve daha az kırılır.
Vibe-coding iş akışıyla yeni özellikleri hızlıca açıyorsanız, JSON sözleşmeleri daha da önemli hale gelir: hızlı yineleme harika ama istemciler ve servisler birbirinden uzaklaştığında sorun başlar.
Koder.ai üzerinde ekipler genellikle bir React frontend ile Go + PostgreSQL backend üretiyor ve ardından API şekillerini planlama modunda kilitlemeden önce yineleyerek ilerliyor. Anlık görüntüler ve geri alma gibi özellikler küçük bir JSON değişikliğinin kırıcı olduğunu gösterdiğinde yardımcı olur ve kaynak kodu dışa aktarma sözleşmeyi deponuza koyup testlerle zorunlu kılmayı kolaylaştırır.
JSON üretmek kolaydır, bu hem gücü hem de tuzağıdır. Bir servis "age": "27" (string) gönderirken diğerinin 27 (number) beklemesi JSON'un kendisi bunu durdurmaz. Sonuç genellikle en kötü türden bir hata olur: üretimde istemci çökmesi veya yalnızca belirli verilerle oluşan ince bir UI hatası.
Doğrulama, kötü veya beklenmeyen veriyi ona güvenen kişilere—frontend'iniz, ortak entegrasyonlarınız, analiz hattınız veya mobil uygulamalarınız—ulaşmadan önce yakalamaktır.
Yaygın hata noktaları: eksik gerekli alanlar, yeniden adlandırılmış anahtarlar, yanlış türler ve "neredeyse doğru" değerler (tutarsız tarih formatları gibi). API sınırında küçük bir doğrulama adımı bunları kesintiden açık hata mesajlarına çevirebilir.
JSON Schema, JSON'un neye benzemesi gerektiğini tanımlamanın standart bir yoludur: gerekli özellikler, izin verilen türler, enum'lar, desenler ve daha fazlası. Aşağıdaki durumlarda özellikle kullanışlıdır:
Bir şemayla istekleri sunucuda doğrulayabilir, testlerde yanıtları doğrulayabilir ve dokümantasyon üretebilirsiniz. Birçok ekip bunu OpenAPI gibi araçlarla eşleştirir, böylece sözleşme kabaca yazılı bilgi yerine açıkça belirtilmiş olur. Eğer zaten geliştirici dokümanları yayımlıyorsanız, örnek şemaları dokümantasyonunuzdan (docs) referanslamak tutarlılığı korur.
Her ekip ilk günden tam şema araçlarına ihtiyaç duymaz. Pratik seçenekler şunlardır:
Yararlı bir kural: önce örnekler ve sözleşme testleriyle başlayın, sonra entegrasyonlar ve değişiklikler çoğaldığında JSON Schema ekleyin.
JSON birkaç alandan oluşan küçük yüklerde "hafif" hissedilir. Ölçeklendiğinde—mobil istemciler zayıf ağlarda, yüksek trafikli API'ler, analiz ağırlıklı sayfalar—JSON, dikkatli şekillendirme ve gönderim yapılmazsa performans sorunu veya güvenilirlik riski olabilir.
En yaygın ölçeklenme sorunu JSON ayrıştırması değil—çok fazla veri göndermektir.
Sayfalandırma basit kazançtır: istemcilerin binlerce kaydı bir kerede indirip işlememesini sağlayacak (örneğin limit + cursor) tahmin edilebilir parçalar döndürün. İç içe geçmiş nesneler döndüren uç noktalar için kısmi yanıtları düşünün: istemcinin sadece ihtiyaç duyduğu alanları (seçilen alanlar veya "include" genişletmeleri) isteyebilmesi. Bu, bir ekranın sadece name ve status ihtiyacı varken tüm geçmiş detayları ve yapılandırma alanlarını almasını önler.
Pratik kural: yanıtları veritabanınızın join yapabildiği şekilde değil, kullanıcı eylemlerine göre (bir ekranın şu an neye ihtiyacı var) tasarlayın.
API'nız büyük JSON yanıtları sunuyorsa, sıkıştırma aktarım boyutunu dramatik şekilde küçültebilir. Birçok sunucu yanıtları otomatik olarak gzip veya brotli ile sıkıştırabilir ve çoğu istemci bunu ekstra kod olmadan işler.
Önbellekleme diğer kaldıraçtır. Yüksek seviyede hedefleyin:
Bu, tekrar indirmeleri azaltır ve trafik ani artışlarını dengeler.
Çok büyük çıktılar—ihracatlar, olay akışları, toplu senkronizasyon—için yanıtları akış olarak düşünün veya istemcilerin tüm belgeyi belleğe almadan işlem yapmasını sağlayacak artımlı ayrıştırma kullanın. Çoğu uygulama için gerekli değil, ama "tek büyük JSON kümesi" zaman aşımına başladığında faydalı bir seçenek olabilir.
JSON loglamayı kolaylaştırır; bu hem yardımcı hem tehlikelidir. Logları bir ürün yüzeyi gibi ele alın:
İyi yapıldığında, daha hızlı hata ayıklarsınız ve kazara veri sızıntısı riskini azaltırsınız.
JSON "bitmiş" değil—stabil. Şimdi değişen şey etrafındaki ekosistemdir: daha güçlü editörler, daha iyi doğrulama, daha güvenli API sözleşmeleri ve ekiplerin kazara kırıcı değişikliklerden kaçınmasına yardımcı olacak daha fazla araç.
JSON muhtemelen web ve mobil uygulamaların çoğu için varsayılan tel format olarak kalacaktır çünkü geniş destekli, hata ayıklaması kolay ve yaygın veri yapılarına temiz eşleme sağlıyor.
En büyük değişim tiplenmiş API'ler yönünde: ekipler hâlâ JSON gönderir, ama onu JSON Schema, OpenAPI ve kod üreteçleri gibi araçlarla daha kesin tanımlarlar. Bu, "şekli tahmin et" anlarını azaltır, daha iyi otomatik tamamlama sağlar ve hataları daha erken yakalar—JSON'dan vazgeçmeden.
Birçok kaydı verimli şekilde göndermeniz veya depolamanız gerektiğinde (loglar, analiz olayları, ihracatlar), tek büyük bir JSON dizisi hantal olabilir. JSON Lines (NDJSON olarak da bilinir) bunu her satıra bir JSON nesnesi koyarak çözer. Satır satır işlenebilir, akışla iyi çalışır ve komut satırı araçlarıyla uyumludur.
Uzun ömürlü olacak bir yük için hızlı bir ön kontrole şunları kullanın:
2025-12-26T10:15:00Z).null arasındaki farkı ayırın ve kararınızı belgelendirin.Daha derine inmek isterseniz, blog'daki ilgili rehberlere göz atın—özellikle şema doğrulama, API versiyonlama ve uzun vadeli uyumluluk için yük tasarımı gibi konulara odaklanan yazılar.