Skip to content
json

JSON (JavaScript Object Notation) Nedir, Nasıl ve Nerede Kullanılır?

JSON veri formatı nedir,nasıl kullanılır, nerelerde kullanılır, XML ve JSON arasındaki farklar nelerdir, JSON nesne (object) dizi (array) örnekleri ve özel karakterleri nelerdir? Hepsine değineceğiz..

JSON Nedir?

Json, Javascript uygulamaları için oluşturulmuş bir veri formatıdır. Javascript Object Notation’ın kısaltmasıdır. Json’ın çıkış amacı veri transferlerinde verilerin XML’den daha az yer kaplamasını sağlamaktır. Şu an sadece Javascript uygulamalarında değil, yazılım geliştirmede kullanılan bir çok teknolojide Json formatındaki veriler tercih edilmektedir. Java uygulamaları .Net uygulamaları PHP uygulamaları Web servis uygulamaları Mobil uygulamaların veri transferleri gibi bir çok noktada veriler Json formatında kullanılmaktadır.

JSON Veri Formatı

Json türündeki veriler iki parçadan oluşur: key (anahtar) ve value (değer). Anahtar’da nesnenin hangi özelliğinin olduğu (koddaki değişken ismi gibi düşünülebilir) tanımlanırken değerde ise anahtar özelliğinin değeri (değişkenin değeri) tanımlanır. Nesnelerdeki anahtar ve değerler string türünde tanımlanır. Aşağıda basit bir json nesnesi örneği bulunmaktadır.

{
   "Ad": "Veysel Uğur",
   "Soyad": "Kızmaz"
}

Yukarıdaki örnekte 2 tane anahtar ve 2 tane değer vardır: “Ad” anahtarının değeri “Veysel Uğur” , “Soyad” anahtarını değeri ise “Kızmaz” olarak tanımlanmıştır.

Nesne içerisinde istediğiniz kadar anahtar – değer (key-value) ikilisi tanımlayabilirsiniz.

{
    "Ad": "Veysel Uğur",
    "Soyad": "Kızmaz",
    "Bolum": "Bilgisayar Muhendisligi",
    "Sehir": "Ankara",
    "Telefon": "05000000000"
}

JSON Nesne(Object) Yapısı

Her Json nesnesi süslü parantez ile başlar ve içinde sonsuz sayıda key-value ikilileri bulunabilir. Json.org sitesinde bu durumu anlatan güzel bir grafik mevcut:

json object

Her Json nesnesi süslü parantez içinde tanımlanır. Nesne içinde anahtar (grafikte string) ve değer (grafikte value) tanımlamaları, araya iki nokta üst üste karakteri gelecek şekilde tanımlanır. Nesne içindeki her key-value ikilisinden sonra virgül karakteri kullanılır. Nesnenin tanımlaması bittikten sonra süslü parantez kapatılır.

Örnek 1: 1 key-value’ya sahip Json nesnesi: “Ad” anahtarının değeri : “Veysel Uğur”.

{
   "Ad": "Veysel Uğur"
}

Örnek 2: 2 key-value’ya sahip Json nesnesi: “Ad” anahtarının değeri: “Veysel Uğur” , “Soyad” anahtarının değeri “Kızmaz”

{
   "Ad": "Veysel Uğur",
   "Soyad": "Kızmaz"
}

JSON Dizi(Array) Yapısı

Her Json dizisi köşeli parantez ile başlar ve içinde sonsuz sayıda değer bulunabilir. Dizilerde key-value ikilileri yoktur. Sadece string değer alabileceği gibi Json nesnesi de tanımlanabilir. Json.org sitesinde bu durumu anlatan güzel bir grafik mevcut:

json array

Her JSON dizisi köşeli parantez içinde tanımlanır. Dizi içindeki tüm değerler aralarında virgül karakteri gelecek şekilde tanımlanır. Dizinin tanımlaması bittikten sonra köşeli parantez kapatılır.

Örnek 1: string değere sahip Json dizisi

[
    "Veysel Uğur"
]

Örnek 2: 2 string değere sahip Json dizisi

[
    "Veysel Uğur",
    "Kızmaz"
]

Örnek 3: Json nesnesine sahip Json dizisi

[
    {
        "Ad": "Veysel Uğur",
        "Soyad": "Kızmaz",
        "Bolum": "Bilgisayar Muhendisligi",
        "Sehir": "Ankara",
        "Telefon": "05000000000"
    }
]

Örnek 4: 2 Json nesnesine sahip Json dizisi

[
    {
        "Ad": "Veysel Uğur",
        "Soyad": "Kızmaz",
        "Bolum": "Bilgisayar Muhendisligi",
        "Sehir": "Ankara",
        "Telefon": "05000000000"
    },
    {
        "Ad": "Neslihan",
        "Soyad": "Yağmur",
        "Bolum": "Tıp Fakültesi",
        "Sehir": "Malatya",
        "Telefon": "05000000001"
    }
]

Örnek 5: Json nesnesi ve 1 string değere sahip Json dizisi

[
    {
        "Ad": "Veysel Uğur",
        "Soyad": "Kızmaz",
        "Bolum": "Bilgisayar Muhendisligi",
        "Okul": "Gazi Üniversitesi",
        "Sehir": "Ankara",
        "Telefon": "05000000000"
    },
    "Asp.Net MVC 5",
    "Uygulamalarla Asp.Net 4.5"
]

JSON Değerlerinin Alabileceği Veriler

Json değerlerinin string veri türünde yazıldığını yukarıda belirtmiştim. Json nesnelerinin içinde değerler (value) farklı türden veriler de alabilirler: “dizi”, “boolean veri (true, false)”, “null”, “Json Nesnesi”. Json değerlerinin esnek yapısı uygulama geliştirme aşamasında büyük kolaylıklar sağlayacaktır.

Örneğin yazar bilgilerinin bulunduğu Yazar ve yazarın kitaplarının bulunduğu Kitap türünde iki sınıfımız olsun. Bir yazarın birden fazla kitabı olabileceği için Yazar nesnesinin içinde birden fazla Kitap tanımlanmasına olanak sağlamalıyız. Aşağıda Yazar ve Kitap isimli C# sınıflarını tanımladım.

public class Yazar
{
    public string Ad { get; set; }
    public string Soyad { get; set; }
    public List<Kitap> Kitaplar { get; set; }
}
public class Kitap
{
    public string Ad { get; set; }
    public int BaskiSayisi { get; set; }
}

Yazar sınıfı türünden bir nesne tanımalyalım. Tanımladığımız yazarın 2 tane de kitabı olsun.

Yazar yazarVeyselUgurKizmaz = new Yazar
{
    Ad = "Veysel Uğur",
    Soyad = "Kızmaz",
    Kitaplar = new List<Kitap>
    {
        new Kitap
        {
            Ad = "Uygulamalarla Asp.Net 4.5",
            BaskiSayisi = 5
        },
        new Kitap{
            Ad = "Asp.Net MVC 5",
            BaskiSayisi = 2
        }
    }
};

Yukarıda C# kodlaması ile tanımladığımız veriyi Json ile tanımlayalım:

{
    "Ad": "Veysel Uğur",
    "Soyad": "Kizmaz",
    "Kitaplar": [
        {
            "Ad": "UygulamalarlaAsp.Net4.5",
            "BaskiSayisi": "5"
        },
        {
            "Ad": "Asp.NetMVC5",
            "BaskiSayisi": "2"
        }
    ]
}
  1. İlk satırda nesnenin başlangıç süslü parantezini tanımladık.
  2. “Ad” ve “Soyad” özelliklerini ve değerlerini 2. ve 3. satırda tanımladık.
  3. 4. satırda “Kitaplar” özelliğinde (anahtarında) kitap dizisi tanımladık. Dizinin içine 2 tane eleman ekledik (yazarın kitapları). Her elemanın “Ad” ve “BaskiSayisi” özelliklerine (anahtarlarına) değerlerini tanımladık.
  4. Dizi tanımlamasını bitirdikten sonra son satırda süslü parantez ile nesneyi sonlandırdık.

Böylelikle C# ile oluşturduğumuz nesnenin aynısını Json formatında da oluşturmuş olduk.

JSON Değerlerinde Kullanılamayan (Özel) Karakterler

Json formatında bir nesne ya da dizi oluştururken bazı karakterlerin kullanımı için karakterin başına “\” eklenmesi gerekir. Bunlar Json.org sitesindeki güzel bir grafik ile anlatılmıştır:

json string

PSR Nedir? Türkçesi PHP Standartları Tavsiyeleri Nedir?

Eğer hırslı bir PHP Geliştirici iseniz, yolunuz mutlaka PSR kısaltması ile kesişmiştir. Bu yazı hazırlanırken PSR-0, PSR-1, PSR-2, PSR-3, PSR-4 ve PSR-7 olmak üzere kabul edilmiş 6 standart tavsiyesi bulunuyor. Bunlara ilave olarak PSR-6 Caching Interface (Önbellek Arayüzü) standardı onay ve PSR-5 PHPDoc Standard (PHPDoc Standardı), PSR-8 Huggable Interface (Sarılabilir Arayüzü), PSR-9 Security Disclosure (Güvenlik Bilgilendirmesi) ve PSR-10 Security Advisories (Güvenlik Önerileri) standartları taslak aşamasında bekliyor.

Bu yazıda kabul edilmiş standartların neler olduğunu ve neden dikkate almanız gerektiğini incelemeye çalışacağım.

Kısa Özet

PHP kod yazmak için hiçbir zaman tam anlamıyla merkezileşmiş bir standarta sahip olmadı. Büyük yazılım ekiplerine sahip şirketler ve birden fazla kod tabanını idame ettiren kişiler projeleri için isimlendirme ve kodlama stilleri hazırladılar. Bazıları PEAR veya Zend Framework gibi iyi dökümante edilmiş standartları baz almaya çalışırken, diğerleri sıfırdan birşeyler üretmeye çalıştılar.

The Framework Interoperability Group (PHP-FIG)

2009 yılındaki php|tek konferansında, çeşitli projeleri temsil eden kişiler projeleri arasında ortaklaşa çalışmanın yollarını tartıştılar. Bunun üzerine kod tabanları arasında bir grup standarda uyulması gündeme geldi.

Bir süre kendilerine “PHP Standards Group” dedikten sonra, bu ismin grubun amacını doğru yansıtmadığını düşündükleri için Framework Interoperability Group (FIG) olarak yollarına devam ediyorlar. Grubun ismi kod çatılarına atıfta bulunsa da çeşitli projeleri temsil eden birçok geliştirici oylayıcı üye olarak gruba kabul edildi.

PHP-FIG’in Amacı

PHP-FIG proje temsilcileri arasında bir dialog ortamı oluşturarak, beraber çalışmanın yollarını aramaktadır. Bu zamana kadar oluşan dialoglar sonucunda 6 tavsiye kabul edilmiştir. Bu tavsiyeler isteyen herkes tarafından uygulanabilmekle birlikte, kimse için zorunlu değildir.

PSR-0: Autoloader Standard (Otomatik Yükleme Standardı) ve PSR-4 Improved Autoloading (Gelişmiş Otomatik Yükleme)

PSR-0 tekrar kullanılabilir kod için büyük bir adımdır.

Her dosyanın başında ihtiyaç duyduğunuz tüm dosyalar için include veya require tanımlaması yaptığınızı hatırlıyor musunuz? Çok şükür bu kullanım PHP 5 ile birlikte gelen sihirli __autoload() fonksiyonu sayesinde değişti. PHP 5.1.2 ‘nin bize tanıştırdığı spl_autoload() ve spl_autoload_register() sayesinde otomatik yükleme çok daha kolay ve dinamik hale geldi.

Otomatik yükleme fonksiyonu ne kadar iyi olsa da, mevcut kod yapılarında nasıl uygulanması gerektiğini tanımlamıyordu. A kütüphanesi ile B kütüphanesinin klasör ve sınıf adı yapısına bakış açısı birbirinden farklı olabiliyor. Fakat siz iki kütüphaneyi de kullanmak istiyorsunuz.

Tüm olasılıkları kapsayacak üzgün bir otomatik yükleme (autoloader) sınıfı yazmak hızlı bir şekilde kaosa dönüşüyordu. Sınıf isimlerini ve nerede olmaları gerektiğini tanımlayan bir standart olmadan otomatik yükleme bir rüyadan ibaretti.

PSR-0 “Ortak çalışan otomatik yükleme için uyulması gereken zorunlu gereksinimler” i tanımlayan bir standart önerisidir. PSR-4‘ün yayınlanması ile birlikte 21 Ekim 2014’de miladını doldurmuştur.

Eğer bir proje PSR-0 veya PSR-4 standardını izliyorsa ve serbest bileşenleri varsa, kolayca ihtiyaç duyduğunuz bileşenleri alıp, vendor klasörünüze koyabilir ve PSR-0 veya PSR-4 uyumlu bir otomatik yükleyici ile o bileşenleri yükleyerek kullanabilirsiniz. Hatta daha iyisi izin verin bunu sizin yerinize Composer yapabilir.

PSR-4, PSR-0’a ilave olarak kütüphane ile gelen dosyaların nereye koyulacağını da belirtmektedir.

PSR-1: Basic Coding Standard (Temel Kodlama Standardı)

PSR-1 en basit düzeyde kodlama standartlarına odaklanmaktadır. Çok detaylı olmaktan kaçınmakta, bu sayede daha büyük bir kitle tarafından benimsenmesi hedeflenmektedir.

PSR-1 kapsamındaki maddelerden bazıları;

  • Dosyalar sadece <?php ve <?= kullanmalıdır.
  • PHP dosyaları sadece UTF-8 without BOM kodlamasına sahip olmalıdır.
  • Dosyalar ya bir sembol tanımlamalı (Sınıf, Fonksiyon, Sabit vs.) ya da bir yan etki ( çıktı üretmek, .ini ayarlarını değiştirmek vs.) üretmelidir. Fakat ikisini birden yapmamalıdır.
  • Namespace ve sınıflar PSR-0 veya PSR-4 standardını izlemelidir.
  • Sınıf isimleri StudlyCaps şeklinde tanımlanmalıdır.
  • Sınıf sabitleri tamamı büyük harf olacak şekilde tanımlanmalıdır.
  • Metod isimleri camelCase şeklinde tanımlanmalıdır.

Bu temel kurallar isimlendirmelere ve dosya yapısına odaklanmaktadır. Bu sayede paylaşılan PHP kodları görünüm ve davranış bakımından aynı olacaktır.

PSR-2: Coding Style Guide (Kodlama Stil Rehberi)

PSR-2, PSR-1 tarafından tanımlanmış temel kodlama standartlarını genişletir. Amacı paylaşılan kodların tek bir şekilde yazılmasını sağlayan bir rehber olmaktır.

Grup üyelerinin temsil ettikleri projeler üzerinde yapılan detaylı inceleme sonucunda en büyük kitleyi kapsayan özellikler temel olarak alınmıştır.

PSR-2 kapsamına genel bakış;

  • Kod PSR-1 kapsamında belirtilen kurallara uymak zorundadır.
  • Girintiler için 4 boşluk kullanılır. Tab değil
  • Satır uzunluklarında katı sınır olmamalıdır. Yumuşak sınır 120 karakterdir. Satırlar mümkünse 80 karakter veya daha kısa olmalıdır.
  • namespace tanımlamasından sonra bir boş satır bırakılmalıdır. use tanımlamalarından sonra da bir satır boşluk olmalıdır.
  • Sınıfların açılış ve kapanış parantezleri alt satırda olmalıdır.
  • Metodların açılış ve kapanış parantezleri alt satırda olmalıdır.
  • Tüm metodlarda görünürlük ( public, protected, private ) tanımlaması bulunmak zorundadır abstract ve final tanımlamaları görünürlük tanımlamasından önce, static ise görünürlük tanımlamasından sonra olmalıdır.
  • Kontrol yapısı anahtar kelimelerinden sonra bir boşluk olmalıdır. metod ve fonksiyon çağrılarında boşluk olmamalıdır.
  • Kontrol yapılarının açılış parantezleri aynı satırda, kapanış parantezleri alt satırda olmalıdır.
  • Kontrol yapılarının açılış parantezlerinden sonra ve kapanış parantezlerinden önce boşluk olmamalıdır.

PSR-2 kurallarının tamamına fig-standards reposundan ulaşabilirsiniz.

PSR-2 standartları günümüzde özellikle github üzerindeki açık kaynak repolarda aktif şekilde kullanılmaya başladı. Bunun en büyük avantajı repo’ya katkıda bulunan kişilerin gönderdiği kodların diff görünümlerinin daha düzgün olması ve herkesin özel kod formatı yüzünden kodun gereksiz yere değişmemesi olduğunu düşünüyorum. Hali hazırda popüler olan tüm editörler PSR-2 uyumlu kod formatlama seçenekleri sunuyorlar. Bu sayede geliştiriciler tek bir seçenek ile evrensel formata uygun kod yazabiliyorlar.

PSR-3: Logger Interface (Loglayıcı Arayüzü)

PSR-3 paylaşılmış bir loglayıcı arayüzünü tanımlar ve The Syslog Protocol (RFC 5424) tarafından belirlenmiş 8 seviyeyi (debug, info, notice, warning, error, critical, alert, emergency) içermektedir.

Bu sekiz Syslog seviyesi metod adı olarak tanımlanmıştir ve her biri $mesaj ve $içerik olmak üzere iki parametre kabul etmektedir. $içerik parametresi, $mesaj parametresi ile düzgün aktarılamayan değerleri taşımaktadır.

PSR-3 gibi bir ortak arayüz standartı; frameworkler, kütüphaneler ve diğer uygulamaların bu ortak arayüze tür dayatma (typehint) yapması sayesinde, geliştiricilerin tercih ettikleri uygulamayı seçmelerine olanak sağlamaktadır.

Başka bir deyişle, PSR-3 uyumlu bir loglama bileşeni, rahatlıkla PSR-3 uyumlu başka bir bileşen ile değiştirilebilmektedir. Bu loglayıcı entegrasyonları ile log çağrıları arasında maksimum ortak çalışmayı garanti altına almaktadır.

Hali hazırda birçok popüler framework’le birlikte gelen Monolog PSR-3 destekli olarak çalışmaktadır.

PSR-7: HTTP Message Interface (HTTP Mesaj Arayüzü)

HTTP mesajları internetin en temel bileşenidir. Bir web sayfasını yüklemek için bir talep (request) yapar ve karşılığınca bir cevap (response) alırsınız. Bir php sitesinin çalışabilmesi için de aynı şekilde gelen talebin anlamlandırılması ve talebe uygun cevabın hazırlanarak müşteriye ulaştırılması gerekir. PSR-7 ile birlikte frameworklerin ve harici bileşenlerin tek bir mesaj arayüzü kullanması ve bu sayede frameworkler ve bileşenler arasındaki tekrar kod kullanılabilirliği arttırılması hedeflenmiştir.

PSR-7 paylaşılmış HTTP mesaj arayüzlerini tanımlar. Bu PSR kapsamında 7 adet arayüz sağlanmaktadır.

Bu arayüzlerden ve kullanım amaçlarından kısaca bahsetmek gerekirse;

  • MessageInterface: Gelen ve giden mesajların tanımlandığı temel arayüzdür.
  • RequestInterface: MessageInterface’i genişleterek talep mesajlarının arayüzünü oluşturur.
  • ResponseInterface: MessageInterface’i genişleterek cevap mesajlarının arayüzüdür.
  • ServerRequestInterface: RequestInterface’i genişleterek sunucu tarafından yapılan taleplerde kullanılan mesaj parametrelerinin tanımlanmasını ve kullanılmasını sağlayan bir arayüzdür.
  • StreamInterface: Mesajların gövdesini oluşturur. Evrensel ve esnek bir yapı olması için, düz bir metin bile olsa akış olarak tanımlanır ve kullanılır.
  • UploadedFileInterface: Mesajlarla birlikte yüklenen dosyaları tanımlayan arayüzdür. $_FILES değişkeni yüklenen dosyanın yükleme metoduna göre farklılık gösterebildiğinden, bu nesne dosya içeriğini standart hale getirir.
  • UriInterface: Talebin yapıldığı URI’yi yönetmek için kullanılır.

Hali hazırda, Pek çok bileşen tarafından kullanılan Guzzle, versiyon 6 ile birlikte PSR-7 altyapısını kullanmaya başladı. Ayrıca Symfony, bünyesindeki popüler HttpFoundation bileşenin PSR-7 uyumluluğunu sağlamak için PSR-7 Bridge adında ek bir bileşen yayınladı.