| 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.
İsimlendirme ve okunuş
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.
Tarihçe
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.
Lisans tartışması
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.
Söz dizimi
JSON söz dizimi iki temel yapı üzerine kuruludur:
- Nesne (object): Sıfır veya daha fazla ad-değer çiftinin süslü ayraçlar (
{ }) 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. - Dizi (array): Sıfır veya daha fazla değerin köşeli ayraçlar (
[ ]) içinde, virgülle ayrılarak sıralanmasıdır.
Veri tipleri
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.
Örnek
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"}
]
}
Standardizasyon
JSON'un resmi standartlaştırma süreci birden fazla kuruluş tarafından yürütülmüştür:
- RFC 4627 (Temmuz 2006): JSON biçimini ve
application/jsonortam türünü tanımlayan ilk belge olarak IETF tarafından "bilgi amaçlı" (informational) statüsünde yayımlanmıştır. - ECMA-404 (Ekim 2013): Ecma International tarafından yayımlanan bu standart, JSON'un söz dizimini biçimsel olarak tanımlar. Aralık 2017'de yayımlanan 2. baskısı güncellenmiş referans metnidir.
- RFC 7159 (Mart 2014): RFC 4627'nin yerini alan güncellenmiş sürümdür.
- RFC 8259 (Aralık 2017): JSON'un güncel internet standardıdır (STD 90). UTF-8 kodlamasını zorunlu kılmakta ve birlikte çalışılabilirlik önerileri içermektedir.
- ISO/IEC 21778:2017: JSON'un ISO tarafından yayımlanan uluslararası standardı olup ECMA-404 ile teknik açıdan özdeştir.
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.
XML ile karşılaştırma
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.
Kullanım alanları
JSON günümüzde çok çeşitli alanlarda kullanılmaktadır:
- Web API'leri: REST mimarisine dayalı web servislerinde istemci-sunucu arası veri iletişiminde en yaygın biçimdir. GitHub, Twitter ve Google gibi büyük platformların API'leri JSON biçiminde veri döndürmektedir.
- NoSQL veritabanları: MongoDB, CouchDB ve Amazon DynamoDB gibi belge tabanlı veritabanları, verileri JSON veya JSON benzeri biçimlerde (örneğin BSON) depolar.
- Yapılandırma dosyaları: Node.js'in
package.jsondosyası, Visual Studio Code'un ayar dosyaları ve TypeScript'intsconfig.jsondosyası gibi pek çok geliştirme aracı yapılandırma amacıyla JSON kullanmaktadır. - Günlük kaydı: Yapılandırılmış günlük (log) sistemlerinde olay verilerinin saklanmasında yaygın olarak tercih edilmektedir.
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.
Türev biçimler
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:
- BSON (Binary JSON): MongoDB tarafından kullanılan ikili JSON biçimidir. Standart JSON'da bulunmayan tarih, ikili veri ve düzenli ifade gibi ek veri tiplerini destekler.
- JSON-LD (JSON for Linking Data): Bağlı veri ilkelerine uygun olarak yapılandırılmış verilerin JSON ile temsil edilmesini sağlayan bir W3C standardıdır. Schema.org ve Google Bilgi Grafiği tarafından kullanılmaktadır.
- JSON Schema: JSON belgelerinin yapısını tanımlamak ve doğrulamak için kullanılan bir şema dilidir. XML'deki XSD'ye benzer bir işlev görür.
- JSONP (JSON with Padding): Tarayıcılardaki aynı köken politikası (same-origin policy) kısıtlamasını aşmak için kullanılmış eski bir yöntemdir. Günümüzde yerini büyük ölçüde CORS'a (Cross-Origin Resource Sharing) bırakmıştır.
- JSON5: Yorum satırları, sondaki virgüller, tek tırnaklı karakter dizileri ve onaltılı sayılar gibi ek özellikler ekleyen, geriye dönük uyumlu bir JSON üst kümesidir. JSON'un 5. sürümü değildir.
JavaScript ile ilişkisi
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.
Güvenlik
JSON verisinin işlenmesinde çeşitli güvenlik riskleri bulunmaktadır:
eval()açığı: JSON verisi doğrudan JavaScript'ineval()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 eklenenJSON.parse()işlevi kullanılmalıdır.- Hizmet reddi saldırıları: Aşırı derinlikte iç içe geçmiş JSON yapıları, ayrıştırıcıların (parser) aşırı bellek veya işlemci tüketmesine neden olarak hizmet reddi saldırılarına yol açabilir.
- Toplu atama açığı (mass assignment): API'lerde JSON girdisinin uygulama katmanında (örneğin Ruby on Rails, Spring gibi çerçevelerde) doğrulama yapılmadan doğrudan veritabanı nesne alanlarına eşlenmesi, yetkisiz veri değişikliklerine neden olabilir. Bu açık, JSON biçiminin kendisinden değil, onu işleyen uygulama çerçevesinin yapılandırma hatasından kaynaklanmaktadır.
Kaynakça
- ^ a b c d e f g h "RFC 8259 — The JavaScript Object Notation (JSON) Data Interchange Format". IETF. Aralık 2017. 10 Nisan 2024 tarihinde kaynağından arşivlendi. Erişim tarihi: 5 Nisan 2026.
- ^ a b c d e f g "Standard ECMA-404 — The JSON Data Interchange Syntax (2nd edition, December 2017)". Ecma International. 27 Ekim 2019 tarihinde kaynağından arşivlendi (PDF). Erişim tarihi: 5 Nisan 2026.
- ^ a b c "Douglas Crockford: The JSON Saga". transcriptvids.com. 25 Şubat 2021 tarihinde kaynağından arşivlendi. Erişim tarihi: 29 Ekim 2019.
- ^ a b "ISO/IEC 21778:2017". ISO. 15 Aralık 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: 29 Temmuz 2019.
- ^ "JSON vs XML: Douglas Crockford". CoRecursive Podcast. 28 Nisan 2026 tarihinde kaynağından arşivlendi. Erişim tarihi: 5 Nisan 2026.
- ^ Sinclair Target (21 Eylül 2017). "The Rise and Rise of JSON". Two-Bit History. 19 Ocak 2022 tarihinde kaynağından arşivlendi. Erişim tarihi: 5 Nisan 2026.
- ^ "JSON.org (2002 arşivi)". Wayback Machine. 3 Ağustos 2002. 23 Şubat 2011 tarihinde kaynağından arşivlendi. Erişim tarihi: 5 Nisan 2026.
- ^ Simon Willison (16 Aralık 2005). "JSON and Yahoo!'s JavaScript APIs". 25 Nisan 2026 tarihinde kaynağından arşivlendi. Erişim tarihi: 5 Nisan 2026.
- ^ "JSON in GData". Google Developers Blog. 21 Kasım 2006. 28 Nisan 2026 tarihinde kaynağından arşivlendi. Erişim tarihi: 5 Nisan 2026.
- ^ "JSON License". json.org. Erişim tarihi: 5 Nisan 2026. Arşivlenmesi gereken bağlantıya sahip kaynak şablonu içeren maddeler (link)
- ^ "Various Licenses and Comments about Them — JSON License". Özgür Yazılım Vakfı. 16 Temmuz 2009 tarihinde kaynağından arşivlendi. Erişim tarihi: 5 Nisan 2026.
- ^ "Bug #692616: json-c: license is non-free". Debian Bug Tracking System. 26 Ocak 2025 tarihinde kaynağından arşivlendi. Erişim tarihi: 5 Nisan 2026.
- ^ "License change request — JSON-java #706". GitHub. 29 Nisan 2026 tarihinde kaynağından arşivlendi. Erişim tarihi: 5 Nisan 2026.
- ^ Douglas Crockford (30 Nisan 2012). "Douglas Crockford on comments in JSON". Google+. 4 Temmuz 2015 tarihinde kaynağından arşivlendi. Erişim tarihi: 5 Nisan 2026.
- ^ "The application/json Media Type for JavaScript Object Notation (JSON)". IETF. Temmuz 2006. 1 Ocak 2016 tarihinde kaynağından arşivlendi. Erişim tarihi: 9 Temmuz 2016.
- ^ "Douglas Crockford — JSON and Beyond". WeAreDevelopers. 6 Ekim 2024. 10 Nisan 2026 tarihinde kaynağından arşivlendi. Erişim tarihi: 5 Nisan 2026.
- ^ a b "JSON and BSON". MongoDB. 28 Mart 2026 tarihinde kaynağından arşivlendi. Erişim tarihi: 5 Nisan 2026.
- ^ Edelman, Jason; Lowe, Scott S.; Oswalt, Matt (2018). Network Programmability and Automation: Skills for the Next-Generation Network Engineer (1 bas.). O'Reilly Media. ISBN 978-1491931257.
- ^ "JSON-LD 1.1". W3C. 16 Temmuz 2020. 4 Nisan 2026 tarihinde kaynağından arşivlendi. Erişim tarihi: 5 Nisan 2026.
- ^ "JSON Schema". Erişim tarihi: 5 Nisan 2026. Arşivlenmesi gereken bağlantıya sahip kaynak şablonu içeren maddeler (link)
- ^ "JSON5 — JSON for Humans". 29 Kasım 2020 tarihinde kaynağından arşivlendi. Erişim tarihi: 5 Nisan 2026.
- ^ "JSON: The JavaScript subset that isn't". Magnus Holm. 13 Mayıs 2012 tarihinde kaynağından arşivlendi. Erişim tarihi: 16 Mayıs 2011.
- ^ "Subsume JSON: Proposal to make all JSON text valid ECMA-262". Ecma TC39. 8 Nisan 2026 tarihinde kaynağından arşivlendi. Erişim tarihi: 5 Nisan 2026.
- ^ "ECMAScript Language Specification (5th Edition)" (PDF). 14 Nisan 2011 tarihinde kaynağından (PDF) arşivlendi. Erişim tarihi: 18 Mart 2011.
- ^ "Mass Assignment Cheat Sheet". OWASP. Erişim tarihi: 5 Nisan 2026. Arşivlenmesi gereken bağlantıya sahip kaynak şablonu içeren maddeler (link)
Ayrıca bakınız
Dış bağlantılar
- "JSON'a Giriş" (İngilizce). 18 Kasım 2011 tarihinde kaynağından arşivlendi.
- "JSON'a Giriş". 17 Kasım 2011 tarihinde kaynağından arşivlendi.
- "RFC 8259 — JSON Standardı" (İngilizce). Arşivlenmesi gereken bağlantıya sahip kaynak şablonu içeren maddeler (link)