JSON’dan JSON’a : JOLT

Talha Uysal
Apinizer
Published in
6 min readDec 30, 2021

Herkese selamlar, JSON yazı serimize devam ediyoruz. Bu yazıda bir JSON dokümanının başka bir JSON dokümanına dönüştürülmesini sağlayan JOLT kavramından bahsedeceğim.

JOLT, başlıktan da anlaşılacağı üzere bir JSON dokümanının başka bir JSON dokümanına dönüştürülmesini sağlar. JOLT, JSON verileri üzerinde veri manipülasyonu gerçekleştirmek yerine, JSON içerisinde bulunan veri yapılarının değiştirilmesine, çok büyük ve karmaşık JSON verisinin daha anlamlı hale gelmesini kendine rol olarak biçmiştir.

Peki JOLT bizim ne işimize yarar ? Neden JOLT’a ihtiyacımız var birazda bundan bahsedelim. Şuanda JSON veri paylaşımı yöntemini kullanan bir çok uygulama var ve bu uygulamalar kendi içerisinde büyük miktarlarda JSON verisi barındırmaktadır. Bir kaç satır JOLT ifadesi yazarak istediğiniz veriyi elde edebilirsiniz. Bir diğer yandan ise JOLT daha ortada yokken JSON’dan JSON’a olan veri dönüşümü tam olarak aşağıdaki görselde belirtildiği gibi gerçekleşmekteydi.

Görseli açıklamak gerekirse eğer elimizde bulunan JSON verisi ilk olarak XML’e dönüştürülürdü daha sonra ise XSLT ya da STX kullanılarak XML’e bir manipülasyon işlemi gerçekleştirilir ve XML’e dönüştürülmesi sağlanırdı. En son aşamada ise oluşan yeni XML’den JSON’a veri dönüşümü gerçekleştirilirdi.

JSON dokümanı içerisinden veri elde etmek istendiğinde birkaç farklı yöntem bulunmaktadır. Ancak bunların içerisinde de en performanslı ve kullanımı kolay olan yöntem ise JOLT kullanımıdır. JOLT ve diğer yöntemlere ait olan performans karşılaştırmasını incelemek isterseniz buradaki linkten erişim sağlayabilirsiniz.

JOLT’un ne işe yaradığını, neden kullanmamız gerektiğini anladıysak eğer JOLT’un yapısına geçebiliriz. Temel JOLT yapısı aşağıdaki kısımda verilmiştir.

[ {
"operation" : "operationName",
"spec" : {
}
} ]

Yukarıdaki alanda da gösterildiği üzere, “operation” alanı ile yapılacak JOLT işlemi belirtilmektedir. Bu işlemler bir nevi bir fonksiyonu nitelendirir. JOLT’un kendi içerisinde “shift”, “sort”, “cardinality”, “modify-default-beta”, “modify-overwrite-beta”, “modify-define-beta” ve “remove” isimli fonksiyonları bulunur. “spec” ifadesi ise üzerinde işlem yapılacak olan alanların ve değerlerin yazıldığı kısımdır.

Temel olarak JOLT’un yapısını gösterdiğimize göre artık vermiş olduğumuz bu fonksiyonların ne anlama geldiğini ve bu fonksiyonlar ile neler gerçekleştirebileceğimizi inceleyelim. Anlatım esnasında kullanacağımız örnek JSON verisi aşağıda yer alan github-gist’inde mevcuttur.

İlk örneğimizde listenin ismini “cars” ifadesinden “arabalar” ifadesi olarak değiştirelim. Bunun için “shift” fonksiyonunu kullanmamız gereklidir.

Siz de isterseniz demo.apinizer.com üzerinden hesap oluşturup test aracımızı deneyebilir, ya da jolt kütüphanesini kurarak kendiniz çalıştırmayı deneyebilirsiniz.

“operation”: “shift”

Shift fonksiyonu girdi olarak verilen JSON verisinde belirtilen ifadeyi kopyalar, bu ifadeye ekleme ve değiştirme işlemlerini gerçekleştirir. İlgili örneğe ait JOLT ifadesi aşağıdaki alanda yer almaktadır.

[{
"operation" : "shift",
"spec" : { l
"cars":"arabalar"
}
}]

Bu ifadenin gerçekleştirildiği örnek ise aşağıda yer verilen görselde yer almaktadır.

Görselde yer alan “Output” alanını incelenecek olursa “cars” key ifadesinin “arabalar” key ifadesi ile değiştiği görülür.

İkinci örneğimizde ise “RentACars” listesine yeni bir key-value veri çifti tanımı gerçekleştirelim. Bunun için “default” fonksiyonunu kullanmamız gereklidir.

“operation”: “default”

Default fonksiyonu girdi olarak verilen JSON verisini bozmadan yeni bir alanı default değeri ile eklemeyi sağlar. Bu alan varsayılan bir değerde olabilir ya da boşta bırakılabilir. İlgili örneğe ait JOLT ifadesi aşağıdaki alanda yer almaktadır.

[ {
"operation" : "default",
"spec" : {
"newFeature":""
}
}]

Bu ifadenin gerçekleştirildiği örnek ise aşağıda yer verilen görselde yer almaktadır.

Görselde yer alan “Output” alanını incelenecek olursa “cars” listesinin sonuna “newFeature” isimli key değerinin eklendiği görülmektedir.

Dördüncü örneğimizde ise “RentACars” listesinde yer alan “motorcycles” array’ini içerisinde tek eleman yer alacak şekilde . Bunun için “cardinality” fonksiyonunu kullanmamız gereklidir.

“operation”: “cardinality”

Cardinality fonksiyonu bir elementin tekillik çoğulluk durumunu ayarlar. Örneğin bir elementin Cardinality değeri MANY yapıldığında o elementin diziye dönüştürüleceği anlamına gelir. Bu örneğimizde ise değer olarak ONE ifadesi kullanılacaktır. İlgili örneğe ait JOLT ifadesi aşağıdaki alanda yer almaktadır.

[
{
"operation": "cardinality",
"spec": {
"RentACar": {
"motorcycles":"ONE",
}
}
}
]

Bu ifadenin gerçekleştirildiği örnek ise aşağıda yer verilen görselde yer almaktadır.

Görselde yer alan “Output” alanını incelenecek olursa “motorcycles” array’inin iki elemandan tek elemana düştüğü görülmektedir.

Beşinci örneğimizde ise “RentACars” listesinde yer alan bütün veriyi silelim. Bunun için “remove” fonksiyonunu kullanmamız gereklidir.

“operation”: “remove”

Remove fonksiyonu ile JSON dokümanı içerisinde yer alan “key-value” çiftlerini silebilirsiniz. İlgili örneğe ait JOLT ifadesi aşağıdaki alanda yer almaktadır.

[
{
"operation": "remove",
"spec": {
"RentACar": {
"cars":"",
"motorcycles":""
}
}
}
]

Bu ifadenin gerçekleştirildiği örnek ise aşağıda yer verilen görselde yer almaktadır.

Görselde yer alan “Output” alanı incelenecek olursa “motorcycles” ve “cars” isimli array’lerin silindiği görülmektedir.

Altıncı örneğimizde ise “RentACars” listesi içerisinde yer alan “cars” array’inde bulunan “brand” key ifadesine sahip olan value’ların yazımının büyük olarak gösterilmesini sağlayalım. Bunun için “modify-overwrite-beta fonksiyonunu kullanmamız gereklidir.

“operation”: “modify-overwrite-beta”

Modify-overwrite-beta fonksiyonu ile JSON dokümanında yer alan ifadeleriniz üzerinde değişiklikler gerçekleştirebilirsiniz. Bu fonksiyon kendi içerisinde toLower, toUpper, concat, min/max/abs, toInteger, toDouble, toLong isimlerinde hazır ifadelerde barındırır. İlgili örneğe ait JOLT ifadesi aşağıdaki alanda yer almaktadır.

[
{
"operation": "modify-overwrite-beta",
"spec": {
"RentACar": {
"cars": {
"*": {
"brand": "=toUpper"
}
}
}
}
}
]

Bu ifadenin gerçekleştirildiği örnek ise aşağıda yer verilen görselde yer almaktadır.

Bu örneğimizde yazdığımız JOLT ifadesinin içerisinde daha önce kullanmadığımız bir ifade yer almaktadır. İfade yeniden incelenecek olursa eğer “cars” ifadesinin tanımından sonra “*” ifadesi gelmektedir. Bu ifade kendisinden önce gelen ifadenin içerisini dolaşır, bir nêvi for görevi görmektedir.

Örnek jolt ifademizi inceleyecek olursak eğer de Cars array’i dolaşılır, “brand” key ifadeleri bulunur ve tanımlanan “operation” ifadesine göre de yapılması gereken işlem gerçekleştirilir.

Yedinci örneğimizde ise “RentACar” listesi içerisinde yer alan ifadelerin gösterimini a’dan z’ye olacak şekilde gerçekleştirelim. Bunun için “sort fonksiyonunu kullanmamız gereklidir.

“operation”: “sort”

Sort fonksiyonu ile JSON dokümanı içerisinde bulunan key ifadeleri alfabetik sıraya göre sıralanabilir. İlgili örneğe ait JOLT ifadesi aşağıdaki alanda yer almaktadır.

[
{
"operation": "sort"
}
]

Görselde yer alan “Output” alanı incelenecek olursak, “RentACar” listesi içerisinde yer alan key ifadelerinin alfabetik sıraya göre listelendiği görülmektedir.

Son örneğimizde ise “RentACar” listesi içerisinde yer alan “Cars” array’ine ait olan key ifadelerini Türkçe karşılıkları ile oluşturalım. Bunun için yazacağımız örnek JOLT ifadesi ise aşağıdadır.

[{
"operation": "shift",
"spec": {
"RentACar": {
"cars": {
"*": {
"carId": "[&1].arabaId",
"brand": "[&1].marka",
"model": "[&1].model",
"color": "[&1].renk",
"dailyPrice": "[&1].günlükFiyat"
}
}
}
}
}]

Bu örneğimizde kullandığımız JOLT ifadesinde yer alan ifadeleri ve karakterleri inceleyecek olursak eğer “*” ifadesi ile “cars” array’inin içerisinde yer alan “key-value” çiftleri dolaşılır. “[&1].X” ifadesiyle de array içerisinde yer alan key değeri elde edilir ve değiştirilecek olan değer yazılır.

Buraya kadar olan kısımları özetlemek gerekirse eğer, JOLT ile JSON dokümanlarınızı başka JSON dokümanlarına çevirebilir, üzerlerinde değişiklikler yapabilirsiniz.

Apinizer’da JOLT

Apinizer’da veri paylaşım yöntemi JSON olan servislerde transformation işlemi oldukça yaygın bir kullanıma sahiptir. Ayrıca sahip olduğu online JSON Transformer ile JSON ve JOLT üzerinde test yapmanıza da imkan verir.

Apinizer’da JOLT ile JSON veri paylaşım yöntemi kullanan servislerinizde hem gelen istek mesajında hem de bu isteğe verilen yanıt mesajı içerisinde değişiklikler yapabileceğiniz “JSON Transformation” poliçesi yer almaktadır. Bu poliçenin nasıl kullanıldığına dair bilgi almak isterseniz buradaki linke tıklayabilirsiniz.

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, JSONPath ile ilgili yazımı okumadıysanız buradaki linkten erişim sağlayabilirsiniz. Bir sonraki yazımda buluşmak dileğiyle.

--

--