JSON (JavaScript Object Notation) Nedir?
Bu yazıda, yayınladığım diğer pek çok konuya ilişkin yazıda bahsi geçen ve yaygın bir şekilde pek çok uygulama ve servis tarafından kullanılan bu sebeple ilerleyen süreçte benim de örnekler içerisinde kullanacağım bir ifadeden, esasında bir veri değişim formatından bahsedeceğim; JSON, tam hali ile JavaScript Object Notation (JavaScript Nesne Gösterimi).
JSON
JSON (JavaScript Object Notation), okuyup yazabilmesi oldukça kolay, uygulamalarda kolaylıkla tarayıp üzerinden ilerlenebilecek yapısal olarak oldukça hafif ve esnek bir veri değişim formatıdır1 ve temel amacı veri alış verişi yaparken daha küçük boyutlarda veri değiştokuşu yapmaktır. Programlama dillerinden bağımsız ancak C, C++, C#, Java, JavaScript, Perl, Python ve daha pek çok programlama diline yazılış bakımından benzeyen JSON tüm bu sebeplerden dolayı ideal bir format haline gelmektedir. JSON yapısal olaak 5 veri tipine sahiptir.
- Number
- String
- Array:
"name": […]
şeklinde kullanılır. - Boolean:
true
|false
- Object:
"name": {..}
şeklinde kullanılır. - Null
Örnek bir JSON içeriğini bu 5 tipi barındıracak şekilde şöyle oluşturabiliriz:
{
"name": "Charles",
"surname": "Freck",
"age": 31,
"address": {
"city": "Anaheim",
"county": "Orange County",
"state": "California",
"coordinates": {
"ID": [
[33, 50, 7.0548, "N"],
[117, 54, 52.2180, "W"]
]
}
},
"contact": [{
"type": "telephone",
"number": "25052006"
},
{
"type": "e-mail",
"name": "ascanner@darkly.com"
},
{
"type": [{
"account": "facebook",
"url": "https://facebook.com/charles.freck",
"official": false
},
{
"account": "twitter",
"url": "https://twitter.com/charles.freck",
"official": true
},
{
"account": "instagram",
"url": "https://instagram.com/charles.freck",
"official": false
},
{
"account": "linkedin",
"url": null,
"official": null
}
]
}
]
}
Bu örneği A-Scanner-Darkly.json
olarak kayıt edebiliriz. Buradaki *.json
JSON içeriği bulunan dosyaların uzantısıdır. Örnekte de görüldüğü üzere veriler 2 parçadan oluşmaktadır. Bu parçalardan ilki key (anahtar), diğeri ise value (değer) olarak nitelendirilir. Key nesnenin (property) hangi özelliğinin olduğunu, değer ise key’in içeriğini kapsar2. Yukarıdaki örnek üzerinden açıklamak gerekirse name
bir key, “Charles” ise value
olarak ifade edilir. Görüldüğü üzere JSON oldukça pratik bir şekilde okunabilmekte ve veri içeriği esnek bir şekilde genişletilebilmekte.
Peki, JSON’u XML ile kıyaslamak -ki REST ve SOAP API ile ilgili yazıda kısa bir kıyaslamam olmuştu- gerekir mi? Neden olmasın?
JSON ve XML Farkı
Öncelikle her iki formatın avantaj ve dezavantajları olduğunu, duruma göre formatların sürdürülebilirlik, esneklik ve güvenlik gibi konular dahilinde tercih edilmesi gerektiğini belirtmekte fayda var. Performans temelinde bir karşılaştırma yapmak gerekirse;
- JSON yığınını okumak oldukça kolaydır. XML dili veri değişim işlemlerinde yavaş kalmaktadır.
- XML etiketlerden oluşur ve standartlar dahilinde işler. Ara işleyişlerde sağlıklı ve güvenli bir yapı sunar. Ancak, esnek değildir. JSON pek çok sistem içerisinde esnek bir şekilde kullanılabilir.
Mesela, yukarıdaki örneği XML olarak oluşturalım.
<?xml version="1.0" encoding="UTF-8" ?>
<root>
<name>Charles</name>
<surname>Freck</surname>
<age>31</age>
<address>
<city>Anaheim</city>
<county>Orange County</county>
<state>California</state>
<coordinates>
<ID>
<row>33</row>
<row>50</row>
<row>7.0548</row>
<row>N</row>
</ID>
<ID>
<row>117</row>
<row>54</row>
<row>52.218</row>
<row>W</row>
</ID>
</coordinates>
</address>
<contact>
<type>telephone</type>
<number>25052006</number>
</form/contact>
<contact>
<type>e-mail</type>
<name>ascanner@darkly.com</name>
</form/contact>
<contact>
<type>
<account>facebook</account>
<url>https://facebook.com/charles.freck</url>
<official>0</official>
</type>
<type>
<account>twitter</account>
<url>https://twitter.com/charles.freck</url>
<official>1</official>
</type>
<type>
<account>instagram</account>
<url>https://instagram.com/charles.freck</url>
<official>0</official>
</type>
<type>
<account>linkedin</account>
<url/>
<official/>
</type>
</form/contact>
</root>
JSON üzerine daha detaylı bilgi almak ve farklı örnekler3 görüntülemek için JSON > JSON’a Giriş1 yazısına göz atmakta fayda var. JSON örnekleri oluşturmak ve test etmek için JSONLint.com sitesinden faydalanabilirsiniz.
Malformed (Geçersiz) JSON
Sık karşılaşılan JSON hatalarındandır ve JSON içeriğinde hatalı bir alan olduğunu (tanımın sonlandırılmadığı, köşeli/süslü parantezin kapatılmadığı durumlar gibi) belirtir. Çoğunlukla bir yazım yanlışı nedeniyle ortaya çıkan bu hata JSON yapısını etkiliyor ise yapının düzenlenmesi sonucunda kolaylıkla çözülebilir. Bu uyarıya neden olabilecek bazı örnekler ve çözüm önerileri4;
- "{test: 1}" (test çift tırnak içerisinde olmalıdır).
- "{'test': 1}" ('test' tek tırnak içerisinde yer almakta, çift tırnak ile güncellenmelidir).
- "'test'" ('test' tek tırnak içerisinde yer almakta, çift tırnak ile güncellenmelidir).
- ".1" (Bir sayı yine sayısal bir değerle başlamalıdır. Örneğin
.1
aslında0.1
ile aynı ifade olsa da.
ile başlamış olması hataya neden olmaktadır. Bu nedenle ilgili değer0.1
olarak güncellenmelidir.). - "undefined" (
undefined
JSON için anlamlı bir ifade değildir. Bunun yerinenull
gibi anlamlı bir ifade kullanılabilir). - "NaN" (
NaN
JSON için anlamlı bir ifade değildir. Ayrıca doğrudan Infinity temsiline de izin verilmez). - JSON standardı tab ve yeni satır gibi kontrol karakterlerinin (
\t
,\n
vb.) kullanımına izin vermez.
Geçersiz JSON ifadelerini JSONFormatter5 ve benzeri araçlarla kontrol edebilir, sorunları kolaylıkla düzenleyebilirsiniz.