Kazananın Hikayesi
Her teknoloji savaşında bir kazanan çıkar. Veri formatları savaşında kazanan açık farkla JSON oldu. XML'i geride bıraktı, YAML'ı niş kullanımlara itti, özel binary formatları yalnızca belirli senaryolara hapsoldu.
Peki neden JSON? Bu kadar basit bir format neden dünyanın en yaygın veri değişim standardı haline geldi?
JSON Nedir?
JSON, JavaScript Object Notation'ın kısaltmasıdır. İsminden de anlaşıldığı gibi JavaScript'in nesne sözdiziminden türemiştir. Ama bugün JavaScript ile sınırlı kalmaktan çok çıkmıştır — her modern programlama dili JSON'ı birinci sınıf olarak destekler.
JSON yalnızca birkaç temel yapı üzerine kuruludur.
Nesne, süslü parantez içinde anahtar-değer çiftlerinden oluşur. Dizi, köşeli parantez içinde sıralı değerler listesidir. Değerler string, sayı, boolean, null, başka bir nesne ya da başka bir dizi olabilir. Bu kadar.
Bu sadelik hem gücüdür hem de yaygınlaşmasının başlıca sebebidir.
XML ile Karşılaştırma: Neden JSON Kazandı?
JSON'dan önce web servislerinin baskın veri formatı XML'di. XML güçlüdür, esnektir, kendi kendini tanımlayan bir yapıya sahiptir. Ama bu güç beraberinde ciddi bir ağırlık getiriyordu.
Aynı kullanıcı verisini her iki formatta düşünün.
XML versiyonunda her değer açılış ve kapanış etiketiyle sarılır.
JSON versiyonunda aynı veri çok daha kompakttır. Anahtarlar tırnak içinde, değerler doğrudan yanlarında, hiyerarşi iç içe süslü parantezlerle ifade edilir.
Bu fark küçük veri örneklerinde sıradan görünebilir. Ama binlerce kayıt içeren büyük yanıtlarda XML'in getirdiği boyut şişmesi hem bant genişliği hem de parse süresi açısından ciddi bir maliyet oluşturur.
Parse Kolaylığı: Her Dilde Doğal
JSON'ın kazanmasının en temel sebebi parse edilmesinin son derece kolay olmasıdır.
JavaScript'te JSON.parse() ile veriyi anında nesneye dönüştürebilirsiniz. Python'da json modülü standart kütüphanededir. Kotlin'de Gson, Moshi ya da kotlinx.serialization ile JSON anahtar-değer eşlemesi birkaç satıra iner.
XML parse etmek için ise DOM parser, SAX parser, XPath, XML Schema gibi kavramlarla boğuşmak gerekiyordu. Her dilde farklı kütüphaneler, farklı yaklaşımlar, farklı karmaşıklıklar.
JSON'ın minimal yapısı, her programlama dilinin bu formatı hızlıca ve güvenle parse edebileceği kütüphaneler yazmasını kolaylaştırdı.
Android'de JSON: Moshi ve Gson
Android geliştirmede JSON ile çalışmak için birkaç popüler kütüphane öne çıkmıştır.
Gson, Google tarafından geliştirilen ve yıllarca Android'in fiili standardı olan kütüphanedir. Reflection tabanlı çalışır — JSON anahtarları ile Kotlin sınıfı arasındaki eşlemeyi çalışma zamanında bulur. Kullanımı son derece kolaydır ama bu kolaylığın bir bedeli vardır. Reflection performans maliyeti getirir ve R8 optimizasyonlarıyla zaman zaman çatışır.
Moshi, Square tarafından geliştirilmiş ve Gson'ın sınırlamalarını aşmak için tasarlanmıştır. Kotlin ile daha derin bir uyumu vardır, null güvenliğini doğru yönetir ve Kotlin code generation ile reflection maliyetinden kaçınılabilir.
kotlinx.serialization, JetBrains'in Kotlin'e entegre ettiği resmi serileştirme kütüphanesidir. Derleme zamanında kod üretir, reflection kullanmaz, Kotlin'in tüm özelliklerini tam anlar. Compose ve modern Kotlin ekosistemiyle en doğal uyumu sunan seçenektir.
JSON'ın Sınırları
Her şey gibi JSON'ın da sınırları vardır.
Binary veri taşımak için uygun değildir. Bir görsel ya da ses dosyasını JSON içinde taşımak için Base64 ile metin formatına çevirmek gerekir. Bu hem boyutu artırır hem de encode/decode maliyeti getirir. Binary veriler için binary formatlar kullanılmalıdır.
Şema doğrulama desteği zayıftır. XML'in XSD ile sağladığı katı şema doğrulaması JSON'da standart değildir. JSON Schema gibi çözümler vardır ama XML kadar olgunlaşmış değildir.
Yorum satırı yoktur. JSON bir konfigürasyon dosyası olarak kullanıldığında yorum eklemek mümkün değildir. Bu sınır, JSON'ın bant genişliği açısından verimli tutulması için bilinçli bir tasarım kararıdır — ama konfigürasyon senaryolarında pratik bir sorun yaratır.
Ve performans kritik uygulamalarda metin tabanlı olması bir dezavantaja dönüşür. Google'ın Protocol Buffers'ı ya da FlatBuffers'ı gibi binary formatlar JSON'a kıyasla çok daha az yer kaplar ve çok daha hızlı parse edilir. Bu yüzden yüksek hacimli iç servis iletişiminde binary formatlar tercih edilir. JSON ise hâlâ insan okunabilirliğinin ve geliştirme hızının öncelikli olduğu durumlarda yerini korur.
Yaygınlığın Gerçek Sebebi
JSON'ı bu kadar yaygın yapan şey teknik üstünlüğünden çok pratik yeterliliğidir.
Mükemmel değildir. Ama yeterince küçüktür, yeterince hızlıdır, yeterince okunabilirdir ve her dilde yeterince iyi desteklenir. Bu "yeterince" kombinasyonu çoğu kullanım senaryosunda başka hiçbir formatın sunmadığı evrensel bir kabul görmesini sağladı.
Bir Android uygulaması geliştirirken tükettiğiniz her REST API'sinin büyük ihtimalle JSON döndürdüğünü bilirsiniz. Bir backend geliştirici bir API tasarlarken hangi formatı kullanacağını düşündüğünde JSON tartışmasız ilk tercih olur. Bu döngüsel kabul, JSON'ı kendi kendini güçlendiren bir standart haline getirdi.
Ve bu güç kolayca değişmeyecek.