在 Dataweave 2.0 中使用枚举映射数据
Mapping data using enum in dataweave 2.0
我输入了一个包含关键字的数组,例如
{
"array" : ["sunday", "monday", "tuesday", "wednesday"]
}
并在 groovy 脚本中枚举为
FUNDAY('sunday'),
BOREDAY('monday'),
OKAYDAY('tuesday'),
NUMBDAY('wednesday'),
YOUCANDOITDAY('thursday'),
PUSHHARDDAY('friday'),
PARTYDAY('saturday')
我想用枚举的 id 更新负载值,如
{
"array" : ["FUNDAY", "BOREDAY", "OKAYDAY", "NUMBDAY"]
}
有什么有效的方法可以做到这一点吗?我知道如果考虑这些数据很容易,但是有些情况下数据很大并且每个关键字的写法变得很忙。寻找通用解决方案。谢谢
您只需要一个 DataWeave 对象来存储从一个值到另一个值的映射。在其他语言中,对象可以被视为散列或字典。您可以从数据库或文件中设置此对象,因此该方法是通用的。
示例:
%dw 2.0
output application/json
var mapping={
sunday: "FUNDAY",
monday: "BOREDAY",
tuesday: "OKAYDAY",
wednesday: "NUMBDAY"
}
---
payload.array map mapping[$]
为了扩展评论中的讨论(真的应该是一个新问题......)我将列出创建数据编织模块的最快方法。这不一定是最好的(没有太多关于这样做的文档),但它会工作得很好。
在anypoint studio 中创建一个新项目。选择与图书馆名称相关的内容。例如,如果这将是一个围绕 XML 功能的库,您可能会将其命名为 xml-dw-library
.
我们需要使用特定的构建配置文件、依赖项和存储库来更改我们的 pom.xml
以支持数据编织模块。我已经创建了一个要点,您可以在此处使用模板:https://gist.github.com/mikeacjones/52ab8e4e01eec4c49116ecaca5f2a9e3 您现在想花时间更新您的 groupId
,因为这决定了您以后将如何使用该模块。就我而言,我将使用 io.syntaxsugar
,因为我将其用作个人项目的命名空间。也设置一个合适的artifactId
。
在 src/main/mule
中继续并删除在那里创建的默认流程。创建用于测试的 MUnit 流程仍然很有用,但我们实际上不会在这里创建流程。
在 src/main/
中,创建一个名为 dw
的文件夹。现在,从这里开始,文件夹名称和文件名称决定了您的导入。在我的例子中,我希望我的导入看起来像这样:import * from io::syntaxsugar::XML
,所以我将使用以下路径创建一个文件调用 XML.dwl
:src/main/dw/io/syntaxsugar/XML.dwl
.
接下来,我将使用我的所有函数设置我的内容(这只是一个示例,所以我使用的是我之前创建的内容)。在这种情况下,我将使用这个:
%dw 2.0
fun appendNamespace(data, nsSelector: (k: Key) -> Namespace | Null) =
data match {
case is Array -> data map appendNamespace($, nsSelector)
case is Object -> data mapObject do {
var ns0 = nsSelector($$)
---
if (ns0 != null) ns0#"$($$)": appendNamespace($, nsSelector)
else ($$): appendNamespace($, nsSelector)
}
else -> data
}
你的项目此时应该看起来像这样:
- 现在我们已经创建了我们的模块,我们可以将它安装到我们的本地 maven 存储库中(或者如果您有一个中央存储库,您可以设置您的分发管理)。
- 最后,要使用它,我们现在可以将此模块作为依赖项添加到项目中:
<dependency>
<groupId>io.syntaxsugar</groupId>
<artifactId>xml-dw-library</artifactId>
<version>1.0.0-SNAPSHOT</version>
<classifier>dw-library</classifier>
</dependency>
然后在数据编织脚本中像这样使用它:
这让您可以让您的 dataweave 模块保持独立和可重用(并在单独的源代码控制下进行跟踪),您还可以将 CI/CD 应用于 dataweave 模块本身,并与您的 mule 应用程序分开进行单元测试。
您可能已经注意到 POM.xml 我们定义了测试资源文件夹;这些实际上允许您使用 dataweave 创建 dataweave 单元测试。对于每个测试,为测试创建一个文件夹(例如:appendNsTest),然后在该文件夹中您可以创建一个名为 inputs 的文件夹,为每个输入放置一个文件(例如:payload.json
或 vars.json
)、out.json/xml/csv/etc
和 transform.dwl
。执行 transform.dwl
并将结果与 out.*
.
进行比较
太多了,所以我已经采用了用于屏幕截图的工作示例并将其发布到此 public 存储库:https://github.com/mikeacjones/xml-dw-library
我输入了一个包含关键字的数组,例如
{
"array" : ["sunday", "monday", "tuesday", "wednesday"]
}
并在 groovy 脚本中枚举为
FUNDAY('sunday'),
BOREDAY('monday'),
OKAYDAY('tuesday'),
NUMBDAY('wednesday'),
YOUCANDOITDAY('thursday'),
PUSHHARDDAY('friday'),
PARTYDAY('saturday')
我想用枚举的 id 更新负载值,如
{
"array" : ["FUNDAY", "BOREDAY", "OKAYDAY", "NUMBDAY"]
}
有什么有效的方法可以做到这一点吗?我知道如果考虑这些数据很容易,但是有些情况下数据很大并且每个关键字的写法变得很忙。寻找通用解决方案。谢谢
您只需要一个 DataWeave 对象来存储从一个值到另一个值的映射。在其他语言中,对象可以被视为散列或字典。您可以从数据库或文件中设置此对象,因此该方法是通用的。
示例:
%dw 2.0
output application/json
var mapping={
sunday: "FUNDAY",
monday: "BOREDAY",
tuesday: "OKAYDAY",
wednesday: "NUMBDAY"
}
---
payload.array map mapping[$]
为了扩展评论中的讨论(真的应该是一个新问题......)我将列出创建数据编织模块的最快方法。这不一定是最好的(没有太多关于这样做的文档),但它会工作得很好。
在anypoint studio 中创建一个新项目。选择与图书馆名称相关的内容。例如,如果这将是一个围绕 XML 功能的库,您可能会将其命名为
xml-dw-library
.我们需要使用特定的构建配置文件、依赖项和存储库来更改我们的
pom.xml
以支持数据编织模块。我已经创建了一个要点,您可以在此处使用模板:https://gist.github.com/mikeacjones/52ab8e4e01eec4c49116ecaca5f2a9e3 您现在想花时间更新您的groupId
,因为这决定了您以后将如何使用该模块。就我而言,我将使用io.syntaxsugar
,因为我将其用作个人项目的命名空间。也设置一个合适的artifactId
。
在
src/main/mule
中继续并删除在那里创建的默认流程。创建用于测试的 MUnit 流程仍然很有用,但我们实际上不会在这里创建流程。在
src/main/
中,创建一个名为dw
的文件夹。现在,从这里开始,文件夹名称和文件名称决定了您的导入。在我的例子中,我希望我的导入看起来像这样:import * from io::syntaxsugar::XML
,所以我将使用以下路径创建一个文件调用XML.dwl
:src/main/dw/io/syntaxsugar/XML.dwl
.接下来,我将使用我的所有函数设置我的内容(这只是一个示例,所以我使用的是我之前创建的内容)。在这种情况下,我将使用这个:
%dw 2.0
fun appendNamespace(data, nsSelector: (k: Key) -> Namespace | Null) =
data match {
case is Array -> data map appendNamespace($, nsSelector)
case is Object -> data mapObject do {
var ns0 = nsSelector($$)
---
if (ns0 != null) ns0#"$($$)": appendNamespace($, nsSelector)
else ($$): appendNamespace($, nsSelector)
}
else -> data
}
你的项目此时应该看起来像这样:
- 现在我们已经创建了我们的模块,我们可以将它安装到我们的本地 maven 存储库中(或者如果您有一个中央存储库,您可以设置您的分发管理)。
- 最后,要使用它,我们现在可以将此模块作为依赖项添加到项目中:
<dependency>
<groupId>io.syntaxsugar</groupId>
<artifactId>xml-dw-library</artifactId>
<version>1.0.0-SNAPSHOT</version>
<classifier>dw-library</classifier>
</dependency>
然后在数据编织脚本中像这样使用它:
这让您可以让您的 dataweave 模块保持独立和可重用(并在单独的源代码控制下进行跟踪),您还可以将 CI/CD 应用于 dataweave 模块本身,并与您的 mule 应用程序分开进行单元测试。
您可能已经注意到 POM.xml 我们定义了测试资源文件夹;这些实际上允许您使用 dataweave 创建 dataweave 单元测试。对于每个测试,为测试创建一个文件夹(例如:appendNsTest),然后在该文件夹中您可以创建一个名为 inputs 的文件夹,为每个输入放置一个文件(例如:payload.json
或 vars.json
)、out.json/xml/csv/etc
和 transform.dwl
。执行 transform.dwl
并将结果与 out.*
.
太多了,所以我已经采用了用于屏幕截图的工作示例并将其发布到此 public 存储库:https://github.com/mikeacjones/xml-dw-library