MULE DataWeave Language 入门学习记录

工具版本
mule-standalone3.9.0
Anypoint-Studio6.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代码,配合一些组件使用来处理。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值