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.