Pazartesi , 20 Kasım 2017

SQL Server 2016 (CTP2) Native JSON Destegi

JSON(JavaScript Object Notation), Xml’e benzer olarak programlama dilinden bağımsız uygulamalar arasında veri alışverişi yaparken kullanılan javascript tabanlı bir formattır. JSON formatında veriler key ve value şeklinde tutulmaktadır. Örneğin aşağıdaki gibi bir kişi bilgisini JSON formatında belirtebiliriz.

{
    "name": "ismail",
    "city": "istanbul",
    "job": "dba"
}

Yukarıdaki JSON formatındaki veriyi incelediğimizde her key değerinin tırnak içinde yazıldığını ve bu key’e ait olan değerinde aralarına : konarak yazıldığını görebiliriz. Ayrıca belirtilen her değer birbirinden virgül işareti ile ayrılmıştır. Benzer şekilde JSON data içinde birden fazla ilişkili değeri bir dizi şeklinde aşağıdaki gibi tutabiliriz.

{
    "name": "ismail",
    "city": "istanbul",
    "job": "dba",
    "phone": [
        {
            "cell": "+905411234567",
            "home": "+902121234567"
        }
    ]
}

Yukarıdaki örnekte kişinin telefon bilgisi birden fazla olabileceği için köşeli parantez içinde dizi olarak belirtilmiştir.

Xml’e göre hem daha okunaklı olması hem daha az yer tutması hem de günümüzde popüler olan bir çok veritabanı yönetim sistemi ile NoSQL çözümlerinin veri tutma formatı olarak JSON kullanmaları artık bu formatın SQL Server’a da entegre edilmesini zorunlu hale getirmiştir.

SQL Server 2016 sürümünde verilerin sorgulanması sonucunda oluşan result set yani çıktının kolay bir şekilde JSON formatına çevrilmesini sağlayabiliriz. Bunun için daha önce verimizi XML’e çevirirken kullandığımız komutlara benzer olarak FOR JSON AUTO ve FOR JSON PATH komutlarını ihtiyacımıza göre kullanabiliriz. Bu komutların SQL Serverda genel kullanımı aşağıdaki gibidir.

SELECT column, expression, column as alias
FROM table1, table2, table3
FOR JSON [AUTO | PATH]

Şimdi verimizi JSON formatına çevirmek için kullanabileceğimiz komutlarımızın detaylarını görelim.

1.       FOR JSON AUTO Kullanımı

FOR JSON AUTO komutunu kullandığımızda sorgu sonucumuz aynı hiyerarşiyi gözetilerek JSON formatına dönüştürülecektir. Şimdi bunu basit bir örnek üzerinde görelim.

sql-server-2016-json1

Yukarıdaki sorgumuzu çalıştırdığımız sorgumuzun tek satırlık çıktısı da yukarıdaki gibi olacaktır. Şimdi sorgumuzun bu çıktısını JSON formatına dönüştürelim. Bunun için sorgumuzun sonuna FOR JSON AUTO komutunu eklememiz yeterli olacaktır.

sql-server-2016-json2

Yukarıdaki örnekte gösterildiği gibi orgumuzun sonuna FOR JSON AUTO komutunu eklediğimizde sorgu sonucumuzun JSON formatında gösterildiğini görebiliriz. Fakat SQL Server Management Stdio’da sorgu sonucumuzun bu şekilde Grid üzerinde görüntülenmesi birden fazla kaydın listelendiği sorgular için okunabilirliği azaltacaktır.

sql-server-2016-json3

Yukarıdaki sorgumuzun sonucuna dikkat ettiğimizde JSON formatındaki verinin fazla olması sebebiyle okunabilirlik azalmıştır. Bu sebeple JSON formatında fazla veri alırken sonuçları grid değil TEXT formatında almak daha faydalı olacaktır. Bunun için SQL Server Management Stdio üzerindeki Result To Text seçeneğini veya sorgumuzu yazdığımız ekranda sağ tıklayarak açılan menüden üzerindeki Result To Text seçeneğini seçerek sorgu sonucumuzun Text formatında görüntülenmesini sağlayabiliriz.

Yukarıdaki gibi sorgu sonucumuzun Text formatında görüntülenmesini sağlayabiliriz. Aynı zamada aşağıdaki gibi sorgulama ekranında sağ tıklayarak gelen menüden Result To seçeneğini seçebiliriz.

sql-server-2016-json5

Yukarıdaki yöntemlerden biri ile sorgu sonucumuz Text formatına dönüştürdükten sonra sorgumuzun sonucuna bakalım.

sql-server-2016-json6

Yukarıdaki resimde gördüğümüz gibi sorgu sonucumuz JSON formatına dönüştürüldükten sonra Text olarak görüntülenmiştir. Şimdi de yukarıda gördüğümüz kolon başlığının görüntülenmemesini sağlayalım. Bunun için sorgu penceremize sağ tıklayarak gelen menüden Query Options seçeneğini seçelim.

sql-server-2016-json7

Yukarıdaki ekranda solda gösterilen menüden Text bölümünü seçtiğimizde ilk olarak Include Column headers in the result set seçeneğini kaldıralım. Böylece artık kolon başlıkları sonuçta gösterilmeyecektir. Bir diğer önemli seçenek ise ekranda sorgu sonucu olarak gösterilen metinsel verinin boyutunun ne kadar olacağı ile ilgilidir. Varsayılan olarak 256 karakter olan bu değer maksimum 8192 karakter olabilmektedir. Bunu da ihtiyaç duyulması halinde değiştirebiliriz.

Şimdi sorgu sonumuza tekrar bakalım.

sql-server-2016-json8

Yukarıdaki resimde gördüğümüz gibi artık kolon başlığı verisi listelenmemektedir. Fakat dikkat ederseniz sorgu sonucunda kaç kaydın etkilendiği bilgisi de JSON formatındaki sorgumuzun sonucu ile aynı yerde gösterilmektedir. Bunun gösterilmemesi içinde bildiğiniz gibi SET NOCOUNT seçeneğini kullanmamız gerekecektir. Şimdi sorgumuzu aşağıdaki gibi değiştirelim.

sql-server-2016-json9

Yukarıdaki resimde gördüğümüz gibi verimizi Text olarak JSON formatına kolayca dönüştürebiliyoruz.

2.  FOR JSON PATH Kullanımı

For JSON Auto komutunu kullanarak sorgumuzun sonucunu hızlıca JSON formatına dönüştürebiliyoruz. Fakat bu komut ile sorgumuzu için statik yani değişmeyen bir formatta JSON üretebiliyoruz. Yani diğer bir değişle For JSON Auto komutu ile standart olarak her kolondaki değerler key/value şeklinde formatlanarak çıktıya eklenir. Fakat bazı durumlarda JSON formatına dönüştürmek istediğimiz veriyi kendimiz formatlamak isteyebiliriz. İşte böyle durumlarda For JSON PATH komutu bize JSON çıktımızın özelleştirme imkânı sunmaktadır. SQL Server Xml çıktılarını da benzer şekilde formatladığımız komutumuzu kullanarak ilgili kolon değerinin hangi hiyerarşi altında listeleneceğini aralarına nokta işareti koyarak belirtebiliriz. Şimdi For JSON PATH komutunu anlamak için bir örnek yapalım fakat örneğin daha iyi anlaşılması için aynı sorgumuzun çıktısını öncelikle For JSON Auto komutu ile JSON formatına dönüştürelim daha sonra ise For JSON PATH ile JSON çıktımızı nasıl formatlayacağımızı görelim.

sql-server-2016-json10

Yukarıdaki sorgumuzun çıktısını incelediğimizde her kolona karşılık gelen değerin bir tane key/value setinden oluşacak şekilde JSON formatına dönüştürüldüğünü görebiliriz. Şimdi aynı sorgumuzu For JSON PATH komutunu kullanarak yazalım.

sql-server-2016-json11

Yukarıdaki resimde aynı sorgumuzun hem For JSON Auto hem de For JSON PATH komutlarını kullanarak yazdığımızda aynı JSON formatında çıktımızın üretildiğini görüyoruz. Fakat For JSON PATH ile varsayılan çıktı dışında sorgu sonucumuzu kendimiz de formatlayabiliriz. Bunun için formatı belirten her kısmı birbirinden nokta işreti ile ayırmamız gerekecektir. Şimdi aynı sorgumzu aşağıdaki gibi formatlayalım.

sql-server-2016-json12

Yukarıdaki sorgumuza dikkat ederseniz JSON çıktısını özelleştirmek için istediğimiz kolonlar için Alias yani takma isim belirleyerek, belirlediğimiz bu isimde aralarına nokta işareti koyarak bunların yeni Key/Value setlerinde yer almasını sağlayabiliriz. Şimdi sorgularımızın çıktısını inceleyelim.

sql-server-2016-json13

Yukarıdaki sorgu sonucumuza dikkat ederseniz Size ve Class kolonlarına ait bilgiler formatta Advanced adında ayrı bir dizi olarak ele alınmış ve bu değerler bu şekilde farklı bir formatta JSON formatına dönüştürülmüştür. Gördüğünüz gibi For JSON PATH komutu JSON çıktısı üretirken esnek bir şekilde formatı bizim belirlememize olanak sağlamaktadır.

 

Hakkında ismailadar

Cevapla

E-posta adresiniz yayınlanmayacak. Required fields are marked *

*


*

Şu HTML etiketlerini ve özelliklerini kullanabilirsiniz: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>