Mulesoft DataWeave İpuçları

Mulesoft DataWeave İpuçları

DataWeave nedir?

DataWeave, bir Mule uygulaması aracılığıyla dolaşan verilere erişmek ve bunları dönüştürmek için MuleSoft tarafından tasarlanmış bir programlama dilidir.

DataWeave yazarken göz önünde bulundurulması yararlı olabilecek birkaç ipucu ve işlemlerinizi kolaylaştırabilecek birçok önemli yöntemi ele almaya çalıştık.

DataWeave İpuçları

Referans olarak aşağıdaki payload’ı dikkate alın:

{

“name”: “Logicalbond”,

“age”: 30,

“profession”: “Mulesoft”,

“date”: “2024–05–29T10:02:45–04:00”,

“comment”: “Özel Karakter.”

}

DataWeave’de Özel Karakter

Eğer payload içerisinde özel karakterler (örneğin “, $ vb.) varsa, DataWeave’de “\” kullanabilirsiniz.

DataWeave Script:

%dw 2.0

output application/json

— -

{

name: payload.name,

age: payload.age,

profession: payload.profession,

date: payload.date,

comment: payload.comment ++ “\$\$ ozel karakter kullanimi \$\$”,

}

Output:

{

“name”: “Logicalbond”,

“age”: 30,

“profession”: “Mulesoft”,

“date”: “2024–05–29T10:02:45–04:00”,

“comment”: “Özel Karakter.$$ ozel karakter kullanimi $$”

}

Dataweave’de Desen eşleştirme

Payload da karmaşık bir deseni doğrulamak istiyorsanız, DataWeave’de regex gücünü kullanabilirsiniz.

Örneğin, payload.name içinde herhangi bir sayı olup olmadığını değerlendirmek istiyorsanız, regex kullanabilirsiniz.

DataWeave Script:

%dw 2.0

output application/json

— -

{

name: payload.name,

age: payload.age,

profession: payload.profession,

date: payload.date,

comment: payload.comment ++ “\$\$ ozel karakter kullanimi \$\$”,

“regex_number_check” : payload.name contains /\d+/

}

Output:

{

“name”: “Logicalbond”,

“age”: 30,

“profession”: “Mulesoft”,

“date”: “2024–05–29T10:02:45–04:00”,

“comment”: “Özel Karakter.$$ ozel karakter kullanimi $$”,

“regex_number_check”: false

}

splitBy

splitBy(text: String, regex: Regex): Array<String>

splitBy’nin bu sürümü, giriş dizesiyle eşleşmesi için bir Java düzenli ifadesini (regex) kabul eder. Regex, giriş dizesindeki herhangi bir karakterle eşleşebilir. splitBy’nin joinBy’nin tersi işlemi gerçekleştirdiğini unutmayın.

DataWeave Script:

%dw 2.0

output application/json

— -

“192.88.99.0/24” splitBy(/[.\/]/)

Output:

[

“192”,

“88”,

“99”,

“0”,

“24”

]

Nesnede dinamik öğeler veya anahtarlar oluşturma

Dinamik bir anahtar veya anahtar değer çiftini dinamik olarak bir nesneye eklemek istiyorsanız.

DataWeave Script

%dw 2.0

output application/json

var dynamic_element = {“dynamic_element”: “dynamic element”}

var dynamic_key = “dynamic_key”

— -

{

(dynamic_element),

(dynamic_key) : “Dynaimc key”

}

Output:

{

“dynamic_element”: “dynamic element”,

“dynamic_key”: “Dynaimc key”

}

Dataweave’de TimeZone kullanımı

Zamanı farklı bir zaman dilimine dönüştürmek istiyorsanız, aşağıdaki gibi yapabilirsiniz. Çeşitli zaman dilimlerinin değerlerini java!java::util::TimeZone::getAvailableIDs() kullanarak alabilirsiniz.

DataWeave Script:

%dw 2.0

output application/json

fun format(d: DateTime) = d as String {format: “yyyy-MM-dd’T’HH:mm:ss.SSS”}

— -

{

CreatedDateTime: format(|2024–06–05T13:23:00.120Z| >> “Etc/UTC”),

}

Output:

{

“CreatedDateTime”: “2024–06–05T13:23:00.120”

}

Tarih ve Saat Formatlama Karakterleri

DataWeave, uuuu-MM-dd tarih biçimindeki u (yıl için), M ve d gibi biçimlendirme karakterlerinin kullanımını destekler. Bu karakterler Java 8 java.time.format paketini temel alır.

Aşağıdaki örnek, now DataWeave işlevinin çıktısını desteklenen harfleri gösterecek şekilde biçimlendirir:

DataWeave Script:

%dw 2.0

var myDateTime = (“2020–11–10T13:44:12.283–08:00” as DateTime)

output application/json

— -

{

“dateTime” : myDateTime,

“era-G” : myDateTime as String { format: “G”},

“year-u” : myDateTime as String {format: “u”},

“year-uu” : myDateTime as String {format: “uu”},

//y is for use with the era (BCE or CE). Generally, use u, instead.

“year-y” : myDateTime as String { format: “y”},

“year-yy” : myDateTime as String { format: “yy”},

“dayOfYear-D” : myDateTime as String { format: “D”},

“monthOfYear-MMMM”: myDateTime as String { format: “MMMM”},

“monthOfYear-MMM”: myDateTime as String { format: “MMM”},

“monthOfYear-MM”: myDateTime as String { format: “MM”},

“monthOfYear-M”: myDateTime as String { format: “M”},

“monthOfYear-LL”: myDateTime as String { format: “LL”},

“monthOfYear-L”: myDateTime as String { format: “L”},

“dayOfMonth-d” : myDateTime as String {format: “d”},

“quarterOfYear-qqq” : myDateTime as String {format: “qqq”},

“quarterOfYear-qq” : myDateTime as String {format: “qq”},

“quarterOfYear-q” : myDateTime as String {format: “q”},

“quarterOfYear-QQQQ” : myDateTime as String {format: “QQQQ”},

“quarterOfYear-QQQ” : myDateTime as String {format: “QQQ”},

“quarterOfYear-QQ” : myDateTime as String {format: “QQ”},

“quarterOfYear-Q” : myDateTime as String {format: “Q”},

// Understand “Y” and “YY” thoroughly before using it.

“weekBasedYear-YY” : myDateTime as String { format: “YY”},

“weekBasedYear-Y” : myDateTime as String { format: “Y”},

“weekInYear-w” : myDateTime as String {format: “w”},

“weekInMonth-W” : myDateTime as String {format: “W”},

“dayOfWeekAbbreviatedName-E” : myDateTime as String {format: “E”},

“dayOfWeekFullName-EEEE” : myDateTime as String {format: “EEEE”},

“localizedDayOfWeek-eeee” : myDateTime as String {format: “eeee”},

“localizedDayOfWeek-eee” : myDateTime as String {format: “eee”},

“localizedDayOfWeek-ee” : myDateTime as String {format: “ee”},

“localizedDayOfWeek-e” : myDateTime as String {format: “e”},

“localizedDayOfWeek-cccc” : myDateTime as String {format: “cccc”},

“localizedDayOfWeek-ccc” : myDateTime as String {format: “ccc”},

“localizedDayOfWeek-c” : myDateTime as String {format: “c”},

“weekOfMonth-F” : myDateTime as String {format: “F”},

“amORpm-a” : myDateTime as String {format: “a”},

// “h” outputs 12 o’clock as 12. Other hours match “K” output.

“hourOfDay1to12-h” : myDateTime as String {format: “h”},

// “K” outputs 12 o’clock as 0. Other hours match “h” output.

“hourOfDay0to11-K” : myDateTime as String {format: “K”},

“clockHourOfAmPm-k” : myDateTime as String {format: “k”},

“hourOfDay0to23-H” : myDateTime as String {format: “H”},

“minuteOfHour-m” : myDateTime as String {format: “m”},

“secondOfMinute-s” : myDateTime as String {format: “s”},

“fractionOfSecond-S” : myDateTime as String {format: “S”},

“millisecondOfDay-A” : myDateTime as String {format: “A”},

“nanosecondCountOfSecond-n” : myDateTime as String {format: “n”},

“nanosecondCountOfDay-N” : myDateTime as String {format: “N”},

“timeZoneID-VV” : myDateTime as String {format: “VV”},

“timeZoneName-zz” : myDateTime as String {format: “zz”},

“localizedZoneOffset-zzz” : myDateTime as String {format: “zzz”},

“localizedZoneOffset-O” : myDateTime as String {format: “O”},

“timeZoneOffsetZforZero-XXX” : myDateTime as String {format: “XXX”},

“timeZoneOffsetZforZero-XX” : myDateTime as String {format: “XX”},

“timeZoneOffsetZforZero-X” : myDateTime as String {format: “X”},

“timeZoneOffset-xxx” : myDateTime as String {format: “xxx”},

“timeZoneOffset-xx” : myDateTime as String {format: “xx”},

“timeZoneOffset-x” : myDateTime as String {format: “x”},

“timeZoneOffset-Z” : myDateTime as String {format: “Z”}

}

Output:

{

“dateTime”: “2020–11–10T13:44:12.283–08:00”,

“era-G”: “AD”,

“year-u”: “2020”,

“year-uu”: “20”,

“year-y”: “2020”,

“year-yy”: “20”,

“dayOfYear-D”: “315”,

“monthOfYear-MMMM”: “November”,

“monthOfYear-MMM”: “Nov”,

“monthOfYear-MM”: “11”,

“monthOfYear-M”: “11”,

“monthOfYear-LL”: “11”,

“monthOfYear-L”: “11”,

“dayOfMonth-d”: “10”,

“quarterOfYear-qqq”: “4”,

“quarterOfYear-qq”: “04”,

“quarterOfYear-q”: “4”,

“quarterOfYear-QQQQ”: “4th quarter”,

“quarterOfYear-QQQ”: “Q4”,

“quarterOfYear-QQ”: “04”,

“quarterOfYear-Q”: “4”,

“weekBasedYear-YY”: “20”,

“weekBasedYear-Y”: “2020”,

“weekInYear-w”: “46”,

“weekInMonth-W”: “2”,

“dayOfWeekAbbreviatedName-E”: “Tue”,

“dayOfWeekFullName-EEEE”: “Tuesday”,

“localizedDayOfWeek-eeee”: “Tuesday”,

“localizedDayOfWeek-eee”: “Tue”,

“localizedDayOfWeek-ee”: “03”,

“localizedDayOfWeek-e”: “3”,

“localizedDayOfWeek-cccc”: “Tuesday”,

“localizedDayOfWeek-ccc”: “Tue”,

“localizedDayOfWeek-c”: “3”,

“weekOfMonth-F”: “3”,

“amORpm-a”: “PM”,

“hourOfDay1to12-h”: “1”,

“hourOfDay0to11-K”: “1”,

“clockHourOfAmPm-k”: “13”,

“hourOfDay0to23-H”: “13”,

“minuteOfHour-m”: “44”,

“secondOfMinute-s”: “12”,

“fractionOfSecond-S”: “2”,

“millisecondOfDay-A”: “49452283”,

“nanosecondCountOfSecond-n”: “283000000”,

“nanosecondCountOfDay-N”: “49452283000000”,

“timeZoneID-VV”: “-08:00”,

“timeZoneName-zz”: “-08:00”,

“localizedZoneOffset-zzz”: “-08:00”,

“localizedZoneOffset-O”: “GMT-8”,

“timeZoneOffsetZforZero-XXX”: “-08:00”,

“timeZoneOffsetZforZero-XX”: “-0800”,

“timeZoneOffsetZforZero-X”: “-08”,

“timeZoneOffset-xxx”: “-08:00”,

“timeZoneOffset-xx”: “-0800”,

“timeZoneOffset-x”: “-08”,

“timeZoneOffset-Z”: “-0800”

}

DataWeave’de Null Kontrolü

isEmpty

isEmpty(elements: Array<Any>): Boolean

Verilen değer boşsa true, değilse false döndürür.

isEmpty öğesinin bu sürümü bir dizi üzerinde çalışır. Diğer sürümler bir dize veya nesne üzerinde çalışır ve null değerleri işler.

Çeşitli operatörler (örneğin sizeOf, “to” vb.) girişleri null olduğunda çalışmaz ve null pointer exception ile sonuçlanır. Bu operatörlere bir değişken tanımlarken her zaman varsayılan değer kullanmak faydalıdır.

DataWeave Script:

%dw 2.0

output application/json

— -

[ isEmpty([]), isEmpty([1]) ]

Output:

[ true,false ]

DataWeave’de ilişki operatörü “~=”

Farklı türdeki değerleri karşılaştırmanız gerektiğinde bu operatör çok kullanışlı olabilir. Örneğin, aşağıdakiörnekte sayısal 30 ile “30” stringini karşılaştırıyoruz. “==” operatörü türleri de karşılaştırır ve false sonucunu verir.

DataWeave Script:

%dw 2.0

output application/json

— -

{

operator1 : 30 ~= “30”,

operator2 : 30 == “30”

}

Output:

{

“operator1”: true,

“operator2”: false

}

DataWeave’de Akış Kontrol ve Kapsam İşlemleri

Aşağıdaki operatörleri herhangi bir DataWeave ifadesi içinde kullanabilirsiniz:

  • do
  • if else
  • else if

do

Bir “do” deyimi, yeni değişkenlerin, fonksiyonların, ek açıklamaların veya ad alanlarının bildirilebileceği ve kullanılabileceği bir kapsam oluşturur. Sözdizimi, — — ile ayrılmış bir başlık ve gövdeden oluşması bakımından bir eşlemeye benzer. Başlığı tüm bildirimlerin tanımlandığı yerdir ve gövdesi ifadenin sonucudur.

Bu örnekte, myfun() kodun ana gövdesinden çağrıldığında “DataWeave” dizesini döndürmek için do kullanılır.

DataWeave Script:

%dw 2.0

output application/json

fun myfun() = do {

var name = “ logicalbond”

— -

name

}

— -

{ result: myfun() }

Output:

{ “result”: “ logicalbond” }

Aşağıdaki örnekte, myVar değişkenine kodun ana gövdesinden başvurulduğunda “DataWeave” dizesini döndürmek için do kullanılır.

DataWeave Script:

%dw 2.0

output application/json

var myVar = do {

var name = “Logicalbond”

— -

name

}

— -

{ result: myVar }

Output:

{

“result”: “Logicalbond”

}

Bir sonraki örnekte, test(p: String) fonksiyonuna aktarılan bir dizeye (“ Bar”) “Foo” dizesini eklemek için do kullanılır.

DataWeave Script:

%dw 2.0

output application/json

fun test(p: String) = do {

var a = “Foo” ++ p

— -

a

}

— -

{ result: test(“ Bar”) }

Output:

{

“result”: “Foo Bar”

}

if else

Bir if deyimi, koşullu bir ifadeyi değerlendirir ve yalnızca koşullu ifade doğru dönerse if altındaki değeri döndürür. Aksi takdirde, else altındaki ifadeyi döndürür. Her if ifadesi eşleşen bir else ifadesine sahip olmalıdır.

Aşağıdaki örnekte { country : “TURKEY” girdisi kullanılır }, başlıktaki myVar değişkeni tarafından tanımlanır:

DataWeave Script:

%dw 2.0

var myVar = { country : “TURKEY” }

output application/json

— -

if (myVar.country == “IST”)

{ currency: “EUR” }

else { currency: “TL” }

Output:

{

“currency”: “TL”

}

if-else yapısını matematiksel, mantıksal, eşitlik ve ilişkisel ifadeler de dahil olmak üzere doğru veya yanlış olarak değerlendirilen herhangi bir koşulda kullanabilirsiniz. Koşul, herhangi bir geçerli girdi üzerinde etkili olabilir.

Bir sonraki DataWeave kodu, aşağıdaki koşullu ifadelerin sonucuna if else ifadelerini uygular:

ex1'de matematiksel bir işlem

if else deyimi, 1 + 1 == 55 işlemi doğruysa true, değilse false Boolean değerini döndürür.

ex2'de bir eşitlik işlemi

if else deyimi, belirtilen dizinin değeri 1 ise 1 döndürür veya değer 1 değilse bir dize döndürür.

ex3 içinde bir isEmpty fonksiyonu

if else deyimi, aRecord.bookId öğesinin bir değer içerip içermediğine bağlı olarak “ID is empty” veya “ID is not empty” dizesini döndürür.

ex4 içinde firstInput üzerinde yineleme yapan bir eşleme

if else deyimi, değer 101'e eşitse bookId değerini bir Sayı olarak döndürür. Değer 101'e eşit değilse belirtilen dizeyi döndürür.

DataWeave Script:

%dw 2.0

var aRecord =

[

“bookId”:”101",

“title”:”world history”,

“price”:”19.99"

]

output application/xml

— -

{ examples:

{

ex1 : if (1 + 1 == 55) true

else false,

ex2 : if ([1,2,3,4][1] == 1) 1

else “value of index 1 is not 1”,

ex3 : if (isEmpty(aRecord.bookId)) “ID is empty”

else “ID is not empty”,

ex4 : aRecord.bookId map (idValue) ->

if (idValue as Number == 101) idValue as Number

else “not 101”

}

}

Output:

<?xml version=’1.0' encoding=’UTF-8'?>

<examples>

<ex1>false</ex1>

<ex2>value of index 1 is not 1</ex2>

<ex3>ID is not empty</ex3>

<ex4>101</ex4>

</examples>

else if

Bir if-else yapısı içinde else if ifadesini kullanarak birkaç else ifadesini birbirine zincirleyebilirsiniz. Aşağıdaki örnek, başlıktaki myVar değişkeni tarafından tanımlanan var myVar = { country : “TR” } girdisini kullanır.

DataWeave Script:

%dw 2.0

var myVar = { country : “TR” }

output application/json

— -

if (myVar.country ==”USA”)

{ currency: “USD” }

else if (myVar.country ==”TR”)

{ currency: “GBP” }

else { currency: “EUR” }

Output:

{

“currency”: “GBP”

}

Aşağıdaki örnek benzerdir ancak girdi olarak nesne yerine bir dizi alır. Kodun gövdesi, Merhaba değişkeninin değerini doldurmak için bir do işlemi içinde if else ve else if deyimlerini kullanır.

DataWeave Script:

%dw 2.0

output application/json

— -

[“Turkey”, “USA”, “Brazil”] map (country) -> do {

var Merhaba = if(country == “Turkey”) “Merhaba”

else if(country == “USA”) “Hello”

else if(country == “Brazil”) “Ola”

else “Üzgünüm! $(country)’nin dilini bilmiyoruz.”

— -

“$(Merhaba) DataWeave”

}

Output:

[

“Merhaba DataWeave”,

“Hello DataWeave”,

“Ola DataWeave”

]

Logicalbond (Mulesoft Partner and Reseller)

Logicalbond, bir MuleSoft Türkiye Yetkili Satıcısı ve İş Ortağıdır. Küçük, orta ölçekli, kurumsal ve stratejik müşteriler için güvenilir entegrasyon çözümleri üretir.

Sertifikalı danışmanlarımız, müşterilerimizin gelişen ihtiyaçlarına uyum sağlamalarına yardımcı olurken aynı zamanda inovasyonu ve dijital dönüşümü destekleyen görev açısından kritik çözümler sağlama konusunda yeteneklidir.

Logicalbond’un güvenilir iş ortağınız olmasına izin verin, biz de kuruluşunuzun ve ekibinizin sürdürülebilir dijital değerler oluşturmasına yardımcı olalım. Daha fazla bilgi için lütfen www.logicalbond.com adresini ziyaret edin.