JSON’ın Yolu: JSONPath

Talha Uysal
Apinizer
Published in
4 min readDec 28, 2021

Herkese selamlar, JSON yazı serimize devam ediyoruz. Bu yazıda JSON dokümanları için bir sorgu dili görevi gören JSONPath kavramından bahsedeceğim.

JSONPath, JSON dokümanları içerisinde yer alan ifadelerin seçilmesine olanak sağlar, aynı zamanda JSON için bir sorgu dilidir ve yazılacak sorguya göre istenilen verinin elde edilmesini sağlar.

JSONPath ifadeleri kök (root) nesne olmasa dahi, her sorgunun başına $ (dolar) ifadesi eklenerek oluşturulur. Diğer path operatörlerini inceleyecek olursak,

“@” : Node öğesini seçme ya da belirtilen node’dan başlatma.

“*” : Joker eleman gibidir, bütün ifadeleri seçmek için kullanılır.

“.” : Bir üst nesnede yer alan özelliği seçer.

“..” : Doküman içerisinde derin bir tarama yapar ve yanına yazılan ifadeyi bulur.

“[ ]” : Bir ad veya array’de kullanılan öğenin alt öğesini belirtmek için kullanılır.

“ : ” : Belirtilen array’i bölmek için kullanılan bir operatördür.

“[? (<Expression>)]” : Belirtilen expression ifadesiyle eşleşen bir nesneyi ya da dizideki tüm öğeleri seçer.

Yukarıda belirtilen operatörlerle birlikte kullanılan, JSONPath kullanımını daha özel bir hale getiren fonksiyonlar bulunmaktadır. Bu fonksiyonlar yazılan sorguları daha işlevsel hâle getirmektedir.

min(): Seçilen bir dizi sayının minimum değerini almayı sağlar.

max(): Seçilen bir dizi sayının maksimum değerini almayı sağlar.

avg(): Seçilen bir dizi sayının ortalama değerini almayı sağlar.

stddev(): Seçilen bir dizi sayının standart sapmasını almayı sağlar.

length(): Seçilen dizinin uzunluğunun elde edilmesini sağlar.

sum(): Seçilen bir dizi sayının toplamını almayı sağlar.

concat(X): İki farklı öğenin birleştirilmesini sağlar.

append(X): Array içerisine eleman eklenmesini sağlar.

JSONPath ile ilgili örneklere geçmeden önce son olarak path sorgusu yazılırken kullanılan mantıksal operatörlerde mevcuttur. Burada sadece JSONPath’e özgü olan operatörlerin açıklaması gerçekleştirilecektir. Diğer operatörler ise örneklerle birlikte gösterilecektir.

in: Bu ifade ile belirtilen değerin sağında ve solunda aynı değerlere sahip olduğunun kontrolü gerçekleştirilir.

nin: “in” ifadesinin aksine bir değerin sağında ve solunda aynı değerlere sahip olmadığının kontrolü gerçekleştirilir.

size: Belirtilen iki dizinin uzunluğunun aynı olup olmadığını kontrol eder.

empty: Belirtilen iki dizininde boş olması gerekmektedir.

Evet yukarıdaki yer alan bilgilerle JSONPath hakkında yeteri kadar teorik bilgiyi elde ettik. Şimdi sırada ise yapacağımız örneklerle bu bilgilerin zihnimizde daha iyi canlanmasını sağlayabiliriz.

Burada gerçekleştireceğimiz bütün örnekleri Apinizer ürünümüz üzerinde yer alan JSONPath Test Konsol’u üzerinden test edeceğiz. Örneklerde test girdisi olarak kullanacağımız JSON verisine aşağıda yer alan github-gist’inden erişim sağlayabilirsiniz.

Şimdi ilk örneğimizde JSON verisi içerisinde yer alan tüm araçların markalarını listeleyelim. Bunun için yazacağımız JSONPath ifadesi $..brand olacaktır. İlgili örneğin gösterildiği görsel ise aşağıda yer almaktadır.

Yukarıdaki görselde de görüldüğü üzere $ ifadesi başlangıç operatörü, .. ise derin taramanın yapıldığı operatör ve brand ifadesi de bulunup listelenmesi gereken ifadedir.

İkinci örneğimizde ise motosikletlere ait olan fiyat bilgilerini listeleyelim. Bunun için yazacağımız JSONPath ifadesi $..motorcycles..dailyPrice olacaktır. İlgili örneğin gösterildiği görsel ise aşağıda yer almaktadır.

Yukarıdaki görselde de görüldüğü üzere $ ifadesi başlangıç operatörü, ..motorcycles ifadesi derin taramanın gerçekleşeceği alanı ve ..dailyPrice ifadesi ise motosikletlere ait olan günlük fiyatların getirilmesini sağlar.

Üçüncü örneğimizde JSONPath içerisinde tanımlı olan hazır fonksiyonları kullanarak bir örnek gerçekleştirelim. Örnek olarak ise RentACar.json isimli JSON dokümanımız içerisinde yer alan en yüksek araç fiyatının kaç olduğunu listeleyelim.

Bunun için kullanılacak olan path ifadesi ise $..dailyPrice.max() ifadesidir. İlgili örneğin gösterildiği görsel ise aşağıda yer almaktadır.

Yukarıdaki görselde de görüldüğü üzere $ ifadesi başlangıç operatörü, ..dailyPrice ifadesi derin taramanın gerçekleşeceği alanı ve .max() ifadesi ise maksimum değeri bulmayı amaçlayan fonksiyondur.

Dördüncü örneğimizde “cars” isimli array içerisinde yer alan son iki objenin gösterimini gerçekleştirelim. Bunun için kullanılacak olan path ifadesi ise $..cars[-2:] ifadesidir. İlgili örneğin gösterildiği görsel ise aşağıda yer almaktadır.

Yukarıdaki görselde de görüldüğü üzere $ ifadesi başlangıç operatörü, ..cars ifadesi derin taramanın gerçekleşeceği alanı ve [-2:] ifadesi ise sondan iki objenin gösterilmesini sağlar.

Son örneğimizde RentACar.json isimli JSON dokümanımız içerisinde yer alan “expensive” isimli key ifadesinden büyük olan arabaları göstermek olsun.

Bunun için kullanılacak olan path ifadesi ise $..cars[?(@.dailyPrice >= $[‘expensive’])] ifadesidir. İlgili örneğin gösterildiği görsel ise aşağıda yer almaktadır.

JSONPath’ in kullanımı ve örnekleri bu anlattıklarımızla sınırlandırılamaz, elde etmek istediğiniz veriye göre uygun path ifadeleri yazabilirsiniz. Daha fazla örnekler ve kullanım için buradaki linke tıklayabilirsiniz.

Apinizer’da JSONPath

Apinizer’da veri paylaşım yöntemi JSON olan servislerde politika uygulamak, veri manipülasyonu yapmak için JSONPath kullanımı oldukça yaygındır. Ayrıca sahip olduğu online JSONPath evaluator ile JSON üzerinde test yapmanıza da imkan verir.

Apinizer ile daha güvenli ve daha hızlı bir şekilde veri iletişimini sağlayabilirsiniz. Apinizer hakkında daha çok bilgi etmek isterseniz buradaki linke tıklayabilirsiniz. Ürün demomuza erişim sağlamak için ise buradaki linke tıklayabilirsiniz.

JSON ile alakalı yazımı okumadıysanız buradaki linkten, JSON Schema ile alakalı yazımı okumadıysanız buradaki linkten erişim sağlayabilirsiniz. Serimin dördüncü ve son yazısı “JOLT” konusu ile devam edecektir. Bir sonraki yazımda buluşmak dileğiyle.

--

--