DataWeave 是 MuleSoft 的數據語言,專門用于數據轉換和映射。在 MuleSoft 的 Anypoint Platform 中,它是數據集成的一部分。下面是一個 DataWeave 語法教程,涵蓋基本的語法和用法。
基本語法
DataWeave 腳本分為三個部分:%dw 聲明、output 指令和數據轉換表達式。
%dw 2.0
output application/json
---
{message: "Hello, World!"
}
-
%dw 2.0
:指定 DataWeave 版本。 -
output application/json
:指定輸出格式。 -
---
:表示數據轉換表達式的開始。
數據類型
DataWeave 支持多種數據類型,包括:
-
String
-
Number
-
Boolean
-
Array
-
Object
-
Null
示例
%dw 2.0
output application/json
---
{string: "Hello",number: 123,boolean: true,array: [1, 2, 3],object: { key: "value" },nullValue: null
}
操作符
算術操作符
+
加-
減*
乘/
除%
取模
邏輯操作符
&&
和||
或!
非
比較操作符
==
等于!=
不等于<
小于>
大于<=
小于等于>=
大于等于
示例
%dw 2.0
output application/json
---
{addition: 1 + 2,multiplication: 3 * 4,comparison: 5 > 3,logical: true && false
}
函數
DataWeave 提供了豐富的內置函數,可以進行各種數據轉換操作。
常用函數
sizeOf
:返回數組或字符串的長度。upper
:將字符串轉換為大寫。lower
:將字符串轉換為小寫。trim
:移除字符串兩端的空白字符。joinBy
:將數組元素用指定字符連接成字符串。
示例
%dw 2.0
output application/json
---
{size: sizeOf("Hello"),upper: upper("hello"),lower: lower("HELLO"),trimmed: trim(" hello "),joined: joinBy(["a", "b", "c"], "-")
}
數組和對象操作
映射 (map)
map
函數用于將數組中的每個元素轉換為另一個值。
%dw 2.0
output application/json
---
[1, 2, 3] map ((item) -> item * 2)
過濾 (filter)
filter
函數用于過濾數組中的元素。
%dw 2.0
output application/json
---
[1, 2, 3, 4, 5] filter ((item) -> item % 2 == 0)
訪問對象屬性
可以通過點符號或方括號訪問對象屬性。
%dw 2.0
output application/json
---
{obj: { a: 1, b: 2 },valueA: payload.obj.a,valueB: payload.obj["b"]
}
條件語句
if-else
可以使用 if-else
進行條件判斷。
%dw 2.0
output application/json
---
{result: if (sizeOf("hello") > 3) "long" else "short"
}
match
match
語句類似于 switch-case 結構。
%dw 2.0
output application/json
---
{sizeCategory: sizeOf("hello") match {case size when size < 5 -> "small"case size when size < 10 -> "medium"else -> "large"}
}
完整示例
1. xml轉Json
將 XML 數據轉換為 JSON,并進行一些數據處理。
輸入數據 (XML)
<orders><order><id>1</id><item>Apple</item><quantity>5</quantity></order><order><id>2</id><item>Banana</item><quantity>10</quantity></order>
</orders>
DataWeave 腳本
%dw 2.0
output application/json
---
payload.orders order map {orderId: order.id,product: upper(order.item),amount: order.quantity as Number
}
輸出數據 (JSON)
[{"orderId": "1","product": "APPLE","amount": 5},{"orderId": "2","product": "BANANA","amount": 10}
]
2. 數組合并
假設有以下 JSON 對象,其中包含用戶信息和用戶語文成績的數組:
輸入數據
{"users": [{ "id": 1, "name": "Alice" },{ "id": 2, "name": "Bob" },{ "id": 3, "name": "Charlie" }],"scores": [{ "userId": 1, "chinese": 85 },{ "userId": 2, "chinese": 90 },{ "userId": 3, "chinese": 78 }]
}
DataWeave 腳本
下面是 DataWeave 腳本,通過用戶 ID 匹配兩個數組,并將結果整合成一個新的 JSON 數組:
%dw 2.0
output application/json
var users = payload.users
var scores = payload.scores
---
users map (user) -> {id: user.id,name: user.name,chinese: (scores filter ((score) -> score.userId == user.id)).chinese[0] // 提取匹配的語文成績
}
輸出數據
[{"id": 1,"name": "Alice","chinese": 85},{"id": 2,"name": "Bob","chinese": 90},{"id": 3,"name": "Charlie","chinese": 78}
]