工具 | 版本 |
---|---|
mule-standalone | 3.9.0 |
Anypoint-Studio | 6.4.0 |
The DataWeave Language is a powerful template engine that allows you to transform data to and from any kind of format (XML, CSV, JSON, Pojos, Maps, etc).
DataWeave Language是一个强大的模板引擎,允许转换数据到任意格式。
DataWeave Language使用地方主要有以下地方
(1)Transform Message Component
(2)MEL 的 相关 Dataweaver 函数
跟随官网QuickStart学习DataWeave(一) ( http - transform message - http 例子)
官网提供了一个例子
dw-quickstart-bundle.zip下载地址,版本3.9.0。
It is always recommended you set up the other components of your flow before you configure the Transform Message component . The Transform Message component picks up all of the available metadata about the input and output on either side of the component in the flow.
官网推荐在使用Transform Message组件时候,先设置其它的组件。Transform Message获取关于flow中在其任一侧上的输入和输出的所有可用metadata元数据
。
官网的快速入门网址详尽的图文说明了Transform Message使用:QUICKSTART例子 一
按照上述官网步骤使用,便可以通过Transform Message
组件将XML格式转为JSON格式。其使用大体分为以下几个步骤:
(1)定义输入输出的元数据(即Transform Message组件两侧的组件的元数据)
(2)设置输入字段与输出字段的映射关系(通过AnypointStudio的UI配置界面可轻松操作),从而生成相应Datawaever语句。
给输出字段分配固定值
对于输出字段双击便可自动生成一行默认值为null的Datawaeve语句
输出字段设置逻辑条件
官网显示,对于输出字段中,可以直接使用语法unless ... otherwise ...
来进行逻辑判断
其Dataweave语法如下:
%dw 1.0
%output application/json
---
{
address1: payload.order.buyer.address,
address2: null,
city: payload.order.buyer.city,
country: payload.order.buyer.nationality,
email: payload.order.buyer.email,
name: payload.order.buyer.name,
postalCode: payload.order.buyer.postCode as :string,
size: "M" unless payload.order.buyer.name == "Michael" otherwise "XXL",
stateOrProvince: payload.order.buyer.state
}
其中name的输入字段是Michael,按照一开始我的poor english,应该是除了名字为Michael外,其余名称的人size应该都为XXL。然而实际运行结果发现,按照上面的语法,只有name是Michael时,才有size为XXL。因此这里的unless ... otherwise ...应该是(除了 ... 才有 ...)
。
一路操作下来大体界面如下
运行后使用postman测试,POST方法传递XML
跟随官网QuickStart学习DataWeave(二) ( http - http - transform message 例子)
官网的快速入门网址详尽的图文说明了Transform Message使用:QUICKSTART例子二
需要注意的是,按照官网步骤,到某一步进行preview时官网说studio会提示create required sample data to execute preview
,此时Dataweave内容默认是
%dw 1.0
%output application/java
---
{
}
但是在实际过程中点击preview并没有官网所说的提示,此时需要修改内容为
%dw 1.0
%output application/java
---
payload
才会有提示。
Whatever exists in the payload – including any child elements at any depth – is transformed directly into Java without changing any of its structure.
via谷歌翻译:无论在有效载荷中存在什么 - 包括任何深度的任何子元素 - 都可以直接转换成Java,而不会改变它的任何结构。
对于%output application/java
可以换成诸如%output text/csv
格式,这行代码在Mule的Dataweave中称为output-directive(输出指令)
,关于Dataweave支持的格式变化说明文档,请点击这里dataweave-formats。当然存在输出指令,也有输入指令
,但是输入指令基本不用设置,因为Mule其内部会进行隐式转换处理。
输出指令官方类型图
【重要参考文档】 Dataweave Operator 说明文档 Operator语法文档
以上步骤如果一步步按照官网操作,利用AnypointStudio强大的UI,已经可以完成简单的输入输出字段映射操作。而编写Dataweave则能够满足更为复杂的映射要求。以下面的固定输入为例,官网Map Operator开始展示了如何利用Dataweave提供的函数来将这段输入映射为其它更灵活的json形式。
输入的input json
[
{
"productCode": "5423",
"size": "m",
"description": "Connect 2016",
"count": 151
},
{
"productCode": "2452",
"size": "m",
"description": "RAML",
"count": 23
},
{
"productCode": "4567",
"size": "xxl",
"description": "Connect 2016",
"count": 329
},
{
"productCode": "1256",
"size": "s",
"description": "RAML",
"count": 0
}
]
官网Dataweave示例一
%dw 1.0
%output application/json
---
shirts: payload map {
size: upper $.size,
description: $.description,
count: $.count
}
map upper 是关键字
可以看到,输入实际是一个json数组,里面包含4个T-shirt的简单信息对象。通过示例一的Dataweave,可以实现将原json数据(数组),转变为json对象(以shirts为key的对象),同时过滤掉productCode字段,将每一个T-shirt信息的小写码值变为大写。
map
关键字能够遍历所提供的元素(示例中为payload),同时$
是每一次遍历的当前操作实例,示例中如果直接使用shirts: payload map $
,则只是将原json数据转变为json对象。示例中使用$
配合点语法来细节地对每一次遍历的项进行操作,配合upper
关键字将小写转大写。
官网Dataweave示例二
%dw 1.0
%output application/json
---
shirts: payload map {
size: upper $.size,
description: $.description,
count: $.count
} filter $.count > 0
根据语句便可知道是一个过滤的例子,官网描述,filter是过滤映射操作完成后创建的数组,而不是跟随map遍历而过滤。只有当映射操作编译完毕后才开始执行filter操作。这里的执行顺序与Dataweave language优先级有关。
【重要参考文档】 Dataweave precedence-table 说明文档 优先级说明文档
官网Dataweave示例三
%dw 1.0
%output application/json
---
shirts: payload map {
size: upper $.size,
description: $.description,
count: $.count
} filter $.count > 0 groupBy $.size
示例三展示了Dataweave的group by操作功能,相较于示例一和示例二只是展示了基础的修改字段值,过滤字段值等操作,group by则更直观感受到Dataweave language的强大,毕竟在数据处理抽取方面,group by后的数据更为具有价值。group by
运算符和filter
运算符属于同一级,第9优先级。
官网Quickstart Guide至此学习已经结束,更多的Dataweave language实践使用需要在项目上积累。
个人总结:Dataweave是企业版提供的强大功能,其使用主要体现在使用Transform Message
组件时,尽管Anypoint Studio的配置UI界面能够帮助完成简单地数据映射过滤操作,但是对数据进一步灵活处理,使其变成另外组件的合法输入,则需要手动编写相应的Dataweave语句。Dataweave提供了很多的操作关键字,使用一个或者多个关键字组合处理能使得原有输入变为“更有用”的输出数据。社区版想要实现类似Dataweave的功能,大体只能通过编写java代码,配合一些组件使用来处理。