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
}
]