JSON Nedir? Detaylı Açıklamalarıyla JSON Rehberi

JSON Nedir?

JSON yani JavaScript Object Notation, kısaca veri alışverişi ve depolama için kullanılan, kendine has söz dizimine sahip metin tabanlı gösterim biçimidir. Tahmin edeceğiniz üzere JS JavaScript’in, O object’in, N ise notation’ın kısaltmasıdır.

JSON aslında sadece metindir. Hem insanların kolayca okuyabileceği hem makinelerin kolayca ayrıştırabileceği bir yapıya sahiptir. Çoğunlukla istemciler ve sunucular arasında veri aktarımı için kullanılır. XML gibi kendine özel bir söz dizimine sahiptir. Bu söz dizimi ile gelen veriyi ayrıştırma işlemiyle (parsing) anlamlandırabiliriz. Söz diziminin nasıl olduğunu ilerleyen başlıklarda göreceğiz.

Douglas Crockford tarafından 2001 yılında ortaya çıkarılmıştır. 2002 yılında bunun için açmış olduğu sitesinden bu formatı açıklamıştır. ECMAScript adı verilen JavaScript standardından (Standard ECMA-262 3rd Edition – December 1999) türetilmiştir. Yani JavaScript’le birebir ilintilidir. Ancak farklı programlama dilleriyle kullanılamayacağı anlamına gelmez. JavaScript’i de bilmemizi gerektirmez. Programlama dilinden bağımsızdır.

JSON dünya çapında oldukça popülerdir. API’lerde ve konfigürasyonlarda oldukça sık kullanılmaktadır.

JSON Dosyası

JSON dosyasının uzantısı .json şeklindedir. MIME ortam türü yani media type ise application/json şeklindedir. Metin karakter kodlaması her zaman Unicode’dur. Varsayılan kodlama UTF-8’dir ancak UTF-16 ve UTF-32’ye de izin verilir.

JSON dosyası bir metin dosyası olduğu için bunu herhangi bir metin editöründe açabilirsiniz. Web’de de json viewer adı altında çevrimiçi birçok site bulunmaktadır. JSON formatter adı altında da hem geçerli olup olmadığını kontrol eden hem daha okunabilir bir görünüme değiştiren adresler de bulunmaktadır.

JSON’ın Yapısı

Tüm JSON bildirimi süslü parantez ile başlar ve süslü parantez biter. Süslü parantez arasında kalan her bölüme JSON nesnesi (JSON object) denir. Bir JSON objesi anahtar-değer çiftlerinin birleşiminden oluşur.

JSON’ı oluşturan 2 temel yapı taşı vardır:

  1. Anahtar-değer veya başka bir ifadeyle isim-değer çifti: Key-value pair olarak bilinen anahtar-değer çifti verinin tutulduğu kısımdır. Anahtar-değer çifti verinin kendisidir.
  2. Sıralı değerler listesi: Dizinin, listenin tutulduğu yapıdır.

Anahtar-değer çifti iki nokta üst üste ile ayrılır. Bunları gösterirken çift tırnak içerisine almamız gerekmektedir. Yani Anahtar-değer çifti {“key” : “value”} ile gösterilir. Örneğin; { “site” : “Arakatman.com” }

Anahtar-değer çiftindeki değerin alabileceği 7 farklı tip bulunur. Bunlar string, number, array, true, false, null ya da başka bir JSON objesi şeklindedir. Bu yapılar iç içe geçebilir. Bunlara ait kuralları söz dizimiyle ilgili başlık altında bulabilirsiniz.

Anahtar değer çiftine üye de (member) denir. Her üye benzersiz bir anahtara sahiptir. Yani bir nesne yapısı içerisinde her üyenin anahtarı farklıdır.

Sıralı değerler listesi yani dizi de köşeli parantezleri içerisinde gösterilir.

Örnek Bir JSON

Aşağıdaki örnekte anahtar-değer çiftleri ve kendi söz dizimiyle bir JSON’ın nasıl olduğunu görebilirsiniz:

{
"Kategori": "JavaScript",
"Alt_Kategori": "JSON",
"Sorular": ["json nedir", "json ne demek", "json ne işe yarar", "json ne için kullanılır", "json nasıl kullanılır", "json nasıl açılır", "jsonp nedir"]
}

Bu örnek başlı başına JSON gösterimidir. Bu örnekte 3 adet anahtar-değer çifti bulunmaktadır. Bunlardan sonuncusu değer listesine sahiptir. Bu örneği bir metin dosyasına kopyalayıp dosyayı .json biçiminde kaydettikten sonra Firefox tarayıcısında nasıl görüntülendiğini deneyimleyebilirsiniz:json-example

JSON’ın Söz Dizimi

JSON’ın kendine has söz dizimi kuralları olduğundan bahsetmiştik. Bu söz dizimine uygun bir şekilde hazırlanmış JSON dosyasına geçerli / valid JSON denir. Söz dizimi kurallarını maddeler halinde görelim:

» Anahtar-değer çifti iki nokta üst üste ile ayrılır.

» Anahtar her zaman çift tırnak içerisinde olmak zorundadır. Değer string tipinde ise çift tırnak içerisinde olmalıdır. String değilse çift tırnak içerisinde olmayabilir. Yani;

{"Bir": 1, "İki": 2 }

veya

{ "Bir": "1", "İki": "2" }

söz dizimine uygun, geçerli (valid) bildirimlerdir. Ancak;

{ "Kategori": Yiyecek, "Alt_Kategori": Meyve }

veya

{ Kategori: "Yiyecek", Alt_Kategori: "Meyve" }

bildirimleri geçerli değildir. Çünkü ilk örnekte string olan değerler çift tırnak içerisinde değildir. İkinci örnekte ise anahtarlar çift tırnak içerisinde değildir.

» String tipindeki bir değerde bazı özel karakterlerin gösterilebilmesi için ters eğik çizgiyle (\) ile gösterilir. Bu karakterler şunlardır:

  • \” tırnak işareti karakteri (U+0022)
  • \\ ters eğik çizgi karakteri (U+005C)
  • \/ eğik çizgi karakteri (U+002F)
  • \b geri boşluk karakteri (U+0008)
  • \f form karakteri (U+000C)
  • \n yeni satır karakteri (U+000A)
  • \r satır başı karakteri (U+000D)
  • \t karakter tablolama karakteri (U+0009)

» Boş bir nesne {} ile gösterilebilir.

» Birden fazla anahtar-değer çifti varsa virgül ile ayrılır.

» Bir nesne veya dizi değerinin her bir üyesinden sonra, sonuncusu hariç, virgül olmalıdır.

» Aynı obje içerisinde anahtarlar benzersiz olmalıdır. Farklı objelerde aynı anahtarlar olabilir. Yani;

{
"key": [{
"key": "value"
}, {
"key": "value"
}]
}

geçerlidir. Ancak;

{
"key": [{
"key": "value"
"key": "value"
}, {
"key": "value"
}]
}

geçerli bir JSON değildir çünkü aynı obje içerisinde mükerrer anahtar bulunmaktadır.

» Sıralı değerler listesi yani dizi köşeli parantezler içerisinde gösterilir. Dizi örnekte de gördüğümüz üzere birden fazla değerin olduğu yapıdır. Değerler virgülle ayrılır. JSON için bu değerlerin sırasının bir anlamı yoktur.

» Boş bir dizi [] ile gösterilebilir.

» Dizideki değerlerin tipleri aynı olmak zorunda değildir. Değerler belirtilen tiplerden herhangi biri olabilir.

» Boolean değerler, küçük harflerle true ve false sabit ifadeleri ile gösterilir.

» Sayı değerleri başında sıfır olmayan ondalıklı basamaklar dizisidir. Önünde eksi işareti olabilir. Kesirli bir kısma sahip olabilir. Ön eki e (U+0065) veya E (U+0045) ve isteğe bağlı olarak + (U+002B) veya -(U+002D) olan bir üsse sahip olabilir. Rakamlar U+0030 ile U+0039 arasında olan karakterlerdir.

» Null değerler küçük harfle null sabiti ile gösterilir.

» Tarih veya buna benzer tipleri bulunmadığı ve tam desteklenmediği için diziye dönüştürülerek kullanılabilir.

» Anahtar ve değer tanımlanırken özel karakterler kullanılabilir.

» Süslü parantez, iki nokta üst üste, virgül, köşeli parantez gibi karakterlerin arasında bulunan boşluk karakterlerinin bir önemi yoktur.

JSON ve XML Farkı – Benzerlikleri

Douglas Crockford, yayımlamış olduğu bir yazıda JSON’ın XML’nin daha hafif bir alternatifi olarak ortaya çıkarıldığını belirtmektedir. Dolayısıyla aralarında bazı benzerlikler ve farklılıklar bulunmaktadır.

JSON veri değişim formatı olarak ortaya çıkmıştır. XML de her ne kadar aynı amaç için kullanılsa da XML başlangıçta belge işaretleme dili olarak tasarlanmıştır. Benzerlikler ve farklılıklar olarak şunları gösterebiliriz:

» XML ve JSON’ın her ikisi de iletişim ve veri saklama için kullanılmaktadır. Her ne kadar XML daha karmaşık olsa da bu karmaşıklığı sadece veri aktarımının yanında belgelerin işlenmesini ve biçimlendirmesini de sağlar.

» Her ikisi de programlama dillerinden bağımsızdır.

» Her ikisi de hem insanların hem makinelerin anlayabileceği şekilde tasarlanmıştır.

» XML daha ağır bir yapıya sahiptir. Ağırdan kastettiğimiz, XML’de etiket bilgileri de olduğu için aynı veri için XML daha fazla bilgi taşımaktadır. Bu da toplam yükün fazla olmasına sebep olmaktadır. JSON bu anlamda ilk, genel, dilden bağımsız veri değişim formatı olan XML’den daha basit ve daha hafiftir.

Örnek bir veriyi her ikisi için de gösterecek olursak;

JSON Gösterimi:

{
"Kategori": "Yiyecek",
"AltKategori": "Meyve",
"Meyveler": ["Elma", "Muz", "Çilek", "Kiraz", "Karpuz", "Kavun", "Portakal"]
}

XML Gösterimi:

<?xml version="1.0" encoding="UTF-8"?>
<root>
<Kategori>Yiyecek</Kategori>
<AltKategori>Meyve</AltKategori>
<Meyveler>
<element>Elma</element>
<element>Muz</element>
<element>Çilek</element>
<element>Kiraz</element>
<element>Karpuz</element>
<element>Kavun</element>
<element>Portakal</element>
</Meyveler>
</root>

Görüldüğü üzere XML’de göstermek için daha çok bilgiye ihtiyaç vardır. Bu örnek için JSON’da 113 karakter varken XML’de 297 karakter bulunmaktadır. Buradaki veri büyüdükçe etiket bilgileriyle birlikte aralarındaki boyut farkı daha da artacaktır.

» JSON yazma konusunda daha hızlıdır.

» XML’de dizi (array) bulunmazken JSON bu yapıyı destekler.

» XML çeşitli kodlamaları desteklerken JSON sadece Unicode’u destekler.

» JSON’da schema tanımı bulunmaz. XML belgelerinin kendisini tanımladığı bir XML schema’ya bağlantısı vardır. Schema da XML’de yazılır. Kullanıcı önceden tanım olduğu için hangi alanların olması gerektiğini bilir. XML schema kullanılarak XML belgelerinin geçerli olup olmadığı kontrol edilebilir. XML schema ile ilgili detaylı bilgi için bu yazıyı inceleyebilirsiniz.

» XML’de iç içe geçmiş yapılardaki bilgileri ayrıştırmak için XPath ve XQuery yapısı bulunur. Ayrıca Çıktıları farklı biçimlere dönüştürmek için XSLT yapısı bulunur.

» XML yorum, ad alanları destekler. JSON’da bunlar bulunmaz.

» XML meta verileri destekler. Kullanıcıya belirli bir verinin etiketi içinde öznitelikler şeklinde ek bilgi ekleme imkanı sağlar.

» Birçok programlama dili içerisinde her ikisiyle de çalışmaya yönelik kütüphaneler mevcuttur.

» JavaScript’in bir alt kümesi olduğu için JSON’ın JavaScript’te işlenmesi oldukça kolaydır.

XML ile ilgili daha detaylı bilgiler için XML Nedir? Neden ve Nasıl Kullanılır? Her Yönüyle XML Rehberi yazısından başlayarak XML kategorisindeki yazıları inceleyebilirsiniz.

JSON ve YAML Farkı – Benzerlikleri

YAML, herhangi bir programlama dili ile konfigürasyon/yapılandırma dosyaları oluşturmak için sıklıkla kullanılan veri değişim biçimidir. YAML işaretleme dili değildir. JSON’ın bir üst kümesidir ancak aralarında söz dizimi olarak önemli farklılıklar bulunmaktadır. Temel bazı farklılıklar şunlardır:

» İkisi arasındaki en önemli farklardan biri YAML’de satır sonu ve girintiler anlam ifade etmektedir. YAML’de hiyerarşi girinti seviyesi ile gösterilir. Yani boşluk karakteri YAML’nin bir parçasıdır.

» YAML’de de anahtar-değer çifti bulunmaktadır. Anahtar-değer çifti her ikisinde de temel yapı taşıdır. YAML’de anahtar her zaman string’tir. Değer ise herhangi bir veri tipi olabilir.

» YAML’de değer kısmında tırnakların kullanımı isteğe bağlıdır. Yani kullanmak zorunlu değildir ama aynı zamanda tek ve çift tırnakları destekler. Yalnız bazı durumlarda gerekli olabilir. Örneğin \n satır sonu karakteri gibi özel karakterleri kullanmak istediğimizde çift tırnak kullanmamız gerekebilir.

» YAML sayısal türleri tanır. Sayı ondalık, onaltılık veya sekizlik olabilir.

» YAML’de boolean değerler de kullanılabilir. True değer olarak True/On/Yes, false olarak ise False/Off/No anahtar kelimeleri kullanılır. JSON’da bunlar söz dizimi kısmında belirttiğimiz gibi sadece (küçük harfle) true ve false şeklindedir.

» Null değer YAML’de ~ işareti veya JSON’da olduğu gibi tırnaksız null sabiti ile gösterilir.

» Diziler yani array tanımları aynı şekilde köşeli parantez içerisinde ve öğeler virgülle ayrılarak gösterilir.

» YAML yorumları destekler. # işareti ile yorum eklenebilir.

Programlama Dillerinde JSON Kullanımı

Farklı programlama dilleri JSON’ın işlemek, ayrıştırmak, oluşturmak, dönüştürmek ve sorgulamak için çeşitli API’lar sunar.

Java için inceleyecek olursak Java, JSON’ın hem işlenmesi için (processing) hem bağlama işlemleri için (binding) destek sağlar. JSON Processing yani JSONP var olan JSON belgelerinin işlenmesi ya da yani JSON dosyası oluşturmak için kullanılır. Binding ise Java sınıfları ve JSON belgeleri arasındaki ilişkiyle ilgilidir.

Java EE özelinde, Java EE 8 ile birlikte her ikisi içinde bazı API’lar sağlamıştır. JSR 374, nesne modelini veya akış modelini kullanarak JSON verilerini ayrıştırmak, dönüştürmek ve sorgulamak için sağlanan JSON PRocessing 1.1 (JSON-P) için Java API’sidir (https://www.jcp.org/en/jsr/detail?id=374). JSR 367 ile de binding için destek sağlamıştır. JSR 367, Java sınıfları ve JSON belgeleri arasında standart bir binding katmanı (meta veri ve çalışma zamanı) sağlayan binding API’sidir (JSON-B) (https://jcp.org/en/jsr/detail?id=367).

Bir başka örnek olarak Python da JSON’ı desteklemektedir. Python json adlı yerleşik bir pakete sahiptir. Ek bir kurulum gerektirmez. JSON objelerine karşılık gelecek Python objeleri ile serialization / deserialization işlemi yapılabilir.


Bu yazı size ne kadar faydalı oldu?

Değerlendirmek için bir yıldıza tıklayın!

Yazının sizin için faydalı olmadığını duymaktan dolayı müteessiriz...

Bu yazıyı geliştirmek isteriz!

Bu yazıyı nasıl geliştirebileceğimizi paylaşmak ister misiniz?