DataWeave 入门:第 1 部分

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡/ 赠书活动

目前,正在 星球 内带小伙伴们做第一个项目:全栈前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 204 小节,累计 32w+ 字,讲解图:1416 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 870+ 小伙伴加入,欢迎点击围观

数据转换是连接的必然组成部分,因为大多数系统不讲同一种语言。即使格式相似,例如当两个 RESTful Web API 交换 JSON 有效负载时,它们的消息结构通常也不同,因此需要进行转换。

在我们的新数据转换引擎 DataWeave 的四部分系列的第一部分中,我们将帮助您学习这种优雅、轻量级的表达语言的基础知识。我们首先将注意力集中在规范格式上,它是您在 DataWeave 中执行的每个表达式的直接结果。在接下来的帖子中,我们将探索 DataWeave 表达式的强大功能并解决一些实际用例。我们还将在太平洋标准时间 9 月 30 日上午 10 点举办介绍 DataWeave 的 网络研讨会

DataMapper 到 DataWeave

熟悉 Anypoint Platform 的人都知道 DataMapper,这是我们提供图形化拖放数据转换方法的第一个解决方案。根据客户反馈,我们了解到用户正在寻找更强大的转换引擎。通过 DataWeave,我们将转换引擎与 Mule 运行时引擎相结合以确保高性能,采用语言优先的方法并使用类似 JSON 的简单语法设计语言。因此,与 DataMapper 中的类似用例相比,编写 DataWeave 表达式所花费的时间只是其一小部分。

开发环境

作为 DataWeave 设计时体验的一部分,您现在可以通过在其他消息处理器中存在的元数据选项卡中明确设置来向 DataSense 指示每条消息的结构。您还应该注意必须转换的消息数据的 MIME 类型。如果这在设计时没有明确设置并且当您使用我们的任何 连接器 时,这将默认为 application/java。对于 HTTP 请求和响应,Mule 将查看 Content-Type 标头并相应地设置它。当您使用 set-variable 和 set-payload 处理器时,您应该明确设置 mime 类型。未能为 xml 内容显式设置 mime 类型将导致它被引擎解释为纯 Java 字符串。 Anypoint Studio 提供了一个具有 3 个面板的 DataWeave 编辑器。在左侧,DataSense 显示传入消息的结构,以及您提供的任何示例数据。在右侧窗格中,根据 DataSense 显示预期的传出结构以及转换的设计时结果,它会在您编写表达式时不断刷新自身。 中间窗格是转换窗格。这分为两个部分。标头是您声明转换输出的 MIME 类型的地方。您还可以将可重用函数和全局变量声明为 xml 用例的命名空间。您至少必须声明 %dw 1.0 标头和输出 mime 类型。虚线下方是您编写表达式的位置。你只需要一种表达方式。有多种表达式类型,但对于大多数转换,您将使用 DataWeave 对象的半文字表达式。同一个 DataWeave 转换器可以从同一个传入消息中生成多个输出。您可以通过单击转换窗格右下角的加号圆圈来完成此操作。这样做会为您呈现另一个转换窗格,您可以通过从转换窗格顶部的下拉列表中选择不同的输出来自由指定不同的目标(flowVars 等)。

文字表达

任何 DataWeave 表达式只能产生 3 种数据类型:简单类型,如字符串和数字、数组和对象。这些中的每一个都可以按字面意思表达: 您通常会使用半文字对象表达式来定义您的转换。要理解这一点,首先考虑上面第 2 行的示例对象文字。 DataWeave 对象是一系列键值对。键是不带引号的字符串,值可以是简单类型、数组或对象。但是,您没有义务按字面意思表达键和值。您可以使用任何返回字符串作为键的表达式,也可以使用任何表达式作为值。您可以使用多种不同的表达式类型。我们将在本系列的下一部分中探索更多这些内容。现在我们专注于文字表达式和变量引用的组合。

变量引用表达式

学习 DataWeave 的关键是理解数据的规范化,每当对有效负载或 flowVars、sessionVars、recordVars、inboundProperties 或 outboundProperties 进行变量引用时,就会发生这种情况。这些表达式将传入数据转换为规范的 DataWeave 格式。因此,无论您的传入数据是 JSON、XML、CSV 还是 Java,都没有区别,因为这些数据将始终解析为 DataWeave 简单类型、数组或对象。您最好只考虑 DataWeave 数据类型,因为它们为您的表达式设置上下文并且是每个表达式的结果。下面是一个如何将传入的 xml 文档解析为对象的示例。当您将输出声明为 application/dw 时,请注意为您提供的便利学习体验。 请注意 xml 中的每个元素如何规范化为对象中的键值对。当一个元素的内容类型很复杂时,那么它的规范化值本身就是一个对象。另请注意,重复元素被规范化为重复键:值对。考虑以下 CSV。它被规范化为一个对象数组,其键值对分别对应于标题的名称和列值。 现在,看一下使用半文字表达式的结果,该表达式将相同的有效负载包装在一个对象中,该对象声明了预测和进行预测的城市:

输出渲染

DataWeave 引擎将规范格式内的实际转换过程与您在标头中定义的输出 mime 类型中相同格式的最终​​呈现分开。不管你的表达有多复杂。如果它是一个具有深层嵌套结构的对象和表达式以及组合表达式的运算符,则所有这些都必须先执行并在外部表达式返回其值之前返回它们的值。正是这个最终值以输出 mime 类型呈现。您需要注意您选择的 MIME 类型所施加的限制。数组不会在 xml 中呈现。您应该选择重复按键。同样,重复键不能在 Json 中呈现。您应该改为生成数组。将对象呈现为 XML,根据 XML 文档只能包含一个根元素的规则,对象只能包含一对键值对。正如我们所见,它的值本身可以是任何复杂性的对象。考虑上面的转换,相应地修改以呈现有效的 XML 文档。