| Javascript Object Notation (JSON) Javascript Nesne Notasyonu | |
|---|---|
| Dosya uzantısı | .json |
| MIME tipi | application/json |
| Çıkış tarihi | 2001 |
| Format türü | Veri değiş tokuşu |
| Teknik standart | STD 90 (RFC 8259), ECMA-404, ISO/IEC 21778:2017 |
| Özgür biçim | Yes |
| Web sitesi | json.org |
JSON (/ˈdʒeɪ.sən/, "JavaScript Object Notation" — JavaScript Nesne Notasyonu), yapılandırılmış verilerin saklanması ve iletilmesi için kullanılan, insan tarafından okunabilir açık standart bir dosya ve veri değişim biçimidir. Ad-değer çiftlerinden oluşan nesneler ve sıralı değer listelerinden oluşan diziler olmak üzere iki temel yapı üzerine kuruludur. Süslü ayraç, köşeli ayraç, iki nokta ve virgüllü yazım biçimiyle birçok bağlam ve uygulamada kullanışlıdır.
JSON, ECMAScript programlama dilinde tanımlanan nesne değişmez söz diziminden esinlenilerek tasarlanmıştır; ancak programlama dilinden bağımsız bir biçimdir. Günümüzde hemen hemen tüm modern programlama dilleri JSON verisi üretme ve ayrıştırma desteği sunmaktadır. JSON, özellikle web uygulamalarında istemci ile sunucu arasındaki veri iletişiminde en yaygın kullanılan veri biçimlerinden biridir.
JSON dosyaları .json uzantısını kullanır. Biçim ilk olarak 2000'li yılların başında Douglas Crockford tarafından tanımlanmıştır. Güncel uluslararası standardı RFC 8259 (STD 90) ve ECMA-404 olarak belirlenmiş olup ISO/IEC 21778:2017 ile de uluslararası standart olarak yayımlanmıştır.
JSON ismi, Douglas Crockford ve ortakları tarafından Mart 2001'de kurulan State Software şirketinde ortaya çıkmıştır. Kurucu ortaklar, biçimin adını JSML (JavaScript Markup Language) mı yoksa JSON (JavaScript Object Notation) mı koyacaklarını oylayarak JSON adını seçmişlerdir.
2017 yılında yayımlanan uluslararası standartlar olan ECMA-404 (2. baskı) ve ISO/IEC 21778:2017, JSON'un İngilizce "Jason" ismi gibi (/ˈdʒeɪ.sən/) okunması gerektiğini belirtmektedir; ECMA-404'ün 2013 tarihli ilk baskısında okunuşa ilişkin bir bilgi yer almamaktaydı. Crockford ise 2011'de bu konuda "Nasıl okunması gerektiği hakkında bol bol tartışılabilir ancak ben umursamıyorum" demiştir.
JSON, 2000'li yılların başında tarayıcı eklentileri ve Flash olmadan, durumsuz tarayıcı-sunucu arası gerçek zamanlı iletişim sağlama ihtiyacından doğmuştur. Douglas Crockford ve Chip Morningstar, Nisan 2001'de ilk JSON mesajını göndermişlerdir.
JSON.org web sitesi 2002 yılında yayına alınmıştır. Aralık 2005'te Yahoo!, bazı web servislerini JSON biçiminde sunmaya başlamış ve bu adım JSON'un yaygınlaşmasında önemli bir dönüm noktası olmuştur. Ardından Google, Kasım 2006'da GData web protokolünde JSON desteğini eklemiştir.
Crockford, JSON referans uygulamaları için özgün bir lisans hazırlamıştır. Bu lisans ilk bakışta MIT Lisansı'na benzese de "The Software shall be used for Good, not Evil" (Bu yazılım iyi amaçlar için kullanılmalıdır, kötü amaçlar için değil) maddesi içermekteydi. Bu madde, açık kaynak topluluğunda önemli lisans uyumsuzlukları yaratmıştır; zira "iyi" ve "kötü" kavramlarının belirsizliği, lisansın ÖYV ve AKG tanımlarına uymamasına neden olmuştur. Crockford, 2022 yılında JSON Java referans uygulamasının (org.json) lisansını kamu malı (public domain) olarak değiştirmiştir.
JSON söz dizimi iki temel yapı üzerine kuruludur:
{ }) içinde, virgülle ayrılarak yazılmasıdır. Her ad bir karakter dizisidir ve iki nokta üst üste (:) ile değerinden ayrılır.[ ]) içinde, virgülle ayrılarak sıralanmasıdır.Bir JSON değeri şu tiplerden biri olabilir:
| Tip | Açıklama | Örnek |
|---|---|---|
| Karakter dizisi (string) | Çift tırnak içinde yazılan Unicode karakter dizisi | "merhaba" |
| Sayı (number) | Ondalık gösterimde tam sayı veya kayan noktalı sayı; üstel gösterim desteklenir | 42, 3.14, -17, 2.5e10 |
| Mantıksal (boolean) | Doğru veya yanlış değeri | true, false |
| Nesne (object) | Ad-değer çiftlerinden oluşan sırasız küme | {"ad": "Ali", "yaş": 30} |
| Dizi (array) | Sıralı değer listesi | [1, 2, 3] |
| Boş değer (null) | Değerin kasıtlı olarak boş olduğunu belirtir | null |
JSON'da yorum satırları, sondaki virgüller (trailing comma), tek tırnaklı karakter dizileri ve sekizli ya da onaltılı sayı gösterimleri desteklenmez. Karakter kodlaması olarak UTF-8 kullanılması zorunlu kılınmıştır. Yorum desteğinin bulunmaması bilinçli bir tasarım kararıdır; Crockford 2012'de bu konuda "Yorumları JSON'dan kaldırdım, çünkü insanların bunları ayrıştırma yönergeleri (parsing directive) tutmak için kullandığını gördüm; bu uygulama birlikte çalışılabilirliği yok edecekti" açıklamasını yapmıştır.
Aşağıdaki örnek, bir kişinin iletişim bilgilerini JSON biçiminde göstermektedir:
{
"ad": "Ayşe",
"soyad": "Yılmaz",
"yaş": 28,
"öğrenci": false,
"adres": {
"şehir": "İstanbul",
"ilçe": "Kadıköy"
},
"telefonlar": [
{"tip": "ev", "numara": "0212 555 1234"},
{"tip": "cep", "numara": "0532 555 5678"}
],
"eş": null
}
Bir diğer örnek olarak, muhtemel bir kitapçının kategori ve ürün bilgileri:
{
"tip": "kitap",
"tür": "roman",
"ürünler": [
{"ad": "İhtiyar Kemancı", "yazar": "Nihat Genç"},
{"ad": "Şu Çılgın Türkler", "yazar": "Turgut Özakman"},
{"ad": "Kar", "yazar": "Orhan Pamuk"}
]
}
JSON'un resmi standartlaştırma süreci birden fazla kuruluş tarafından yürütülmüştür:
application/json ortam türünü tanımlayan ilk belge olarak IETF tarafından "bilgi amaçlı" (informational) statüsünde yayımlanmıştır.JSON bilinçli olarak sürüm numarası taşımaz ve söz diziminin değişmemesi amaçlanmıştır. ECMA-404 standardı bu durumu "Bu kadar yalın olduğu için JSON dilbilgisinin herhangi bir zaman değişmesi beklenmemektedir" ifadesiyle açıklamaktadır. Crockford da bu tasarım felsefesini "Her şey değişiyor ama JSON katmanı değişmiyor; JSON katmanı zamanın sonuna kadar olduğu gibi kalacak" sözleriyle özetlemiştir.
JSON, web uygulamalarında veri değişimi için XML'e bir alternatif olarak öne çıkmıştır. İki biçim arasındaki başlıca farklar şunlardır:
| Özellik | JSON | XML |
|---|---|---|
| Söz dizimi | Daha kısa ve yalın | Açma-kapama etiketleri gerektirir |
| Veri tipleri | Sayı, mantıksal, null doğrudan desteklenir | Her şey karakter dizisidir |
| Diziler | Doğrudan desteklenir | Ek yapılar gerektirir |
| Yorumlar | Desteklenmez | Desteklenir |
| Ad alanları | Desteklenmez | Desteklenir |
| Dosya boyutu | Genellikle daha küçük | Genellikle daha büyük |
JSON'un daha küçük dosya boyutu ve JavaScript ile doğal uyumu, özellikle RESTful web servislerinde XML'in yerini almasında belirleyici olmuştur. Bununla birlikte XML; belge işaretleme, ad alanı desteği ve şema doğrulama gerektiren kullanımlarda tercih edilmeye devam etmektedir.
JSON günümüzde çok çeşitli alanlarda kullanılmaktadır:
package.json dosyası, Visual Studio Code'un ayar dosyaları ve TypeScript'in tsconfig.json dosyası gibi pek çok geliştirme aracı yapılandırma amacıyla JSON kullanmaktadır.JSON her ne kadar bir veri biçimi olsa da yapılandırma dosyalarında sıkça kullanılması, yorum desteğinin eksikliğini belirgin hâle getirmiştir. Bu ihtiyacı karşılamak amacıyla HJSON, HOCON ve JSON5 gibi standart dışı türevler ortaya çıkmıştır.
JSON'un bazı sınırlamalarını gidermek veya belirli kullanım senaryolarına uyarlamak amacıyla çeşitli türev biçimler geliştirilmiştir:
JSON, JavaScript'in nesne değişmez söz diziminden türetilmiş olsa da iki biçim arasında teknik farklılıklar bulunmaktadır. ES2019 öncesinde, JSON'da geçerli olan U+2028 (Satır Ayırıcı) ve U+2029 (Paragraf Ayırıcı) Unicode karakterleri, JavaScript karakter dizileri içinde doğrudan kullanıldığında söz dizimi hatasına (SyntaxError) neden olmaktaydı. Bu durum, JSON'un tam anlamıyla JavaScript'in bir alt kümesi olmadığını göstermekteydi. ECMAScript 2019 standartlaştırmasıyla birlikte TC39'un "Subsume JSON" önerisi kabul edilmiş ve JSON, JavaScript'in tam bir alt kümesi hâline getirilmiştir.
JSON verisinin işlenmesinde çeşitli güvenlik riskleri bulunmaktadır:
eval() açığı: JSON verisi doğrudan JavaScript'in eval() işlevi ile yorumlandığında, veri içine gömülmüş kötü niyetli kod çalıştırılabilir. RFC 8259'un güvenlik bölümü bu riski açıkça belgelemektedir. Bu nedenle JSON ayrıştırma işlemi için ECMAScript 5 ile birlikte eklenen JSON.parse() işlevi kullanılmalıdır.