在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[$]
,

为了扩展评论中的讨论(应该真的是一个新问题...),我将列出创建 dataweave 模块的最快方法。这不一定是最好的(关于这样做的文档并不多),但它会工作得很好。

  1. 在 anypoint studio 中创建一个新项目。选择与库名称相关的内容。例如,如果这将是一个围绕 XML 功能的库,您可能会将其命名为 xml-dw-library 之类的东西。

  2. 我们需要使用特定的构建配置文件、依赖项和存储库更改我们的 pom.xml 以支持 dataweave 模块。我已经创建了一个要点,您可以在此处使用模板:https://gist.github.com/mikeacjones/52ab8e4e01eec4c49116ecaca5f2a9e3 您现在想花时间更新您的 groupId,因为这决定了您以后将如何使用该模块。就我而言,我将使用 io.syntaxsugar,因为我将它用作个人项目的命名空间。还要设置适当的 artifactId

pom screenshot

  1. src/main/mule 中继续删除在那里创建的默认流。为测试创建 MUnit 流仍然很有用,但我们实际上不会在这里有一个流。

  2. src/main/ 中,创建一个名为 dw 的文件夹。现在,从这里开始,文件夹名称和文件名决定了您的导入。就我而言,我希望我的导入看起来像这样:import * from io::syntaxsugar::XML,因此我将使用以下路径创建文件调用 XML.dwlsrc/main/dw/io/syntaxsugar/XML.dwl

  3. 接下来,我将使用我的所有功能设置我的内容(这只是一个示例,所以我使用的是我之前创建的内容)。在这种情况下,我将使用这个:

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

此时您的项目应该如下所示:

studio screenshot

  1. 现在我们已经创建了我们的模块,我们可以将它安装到我们本地的 maven 存储库中(或者,如果您有一个中央存储库,您可以设置您的分发管理)。

enter image description here

  1. 最后,为了使用它,我们现在可以将此模块作为依赖项添加到项目中:
<dependency>
    <groupId>io.syntaxsugar</groupId>
    <artifactId>xml-dw-library</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <classifier>dw-library</classifier>
</dependency>

然后像这样在 dataweave 脚本中使用它:

enter image description here

这让您可以保持您的 dataweave 模块独立和可重用(并在单独的源代码控制下进行跟踪),您还可以将 CI/CD 应用于 dataweave 模块本身,并与您的 mule 应用程序分开进行单元测试。

您应该已经注意到我们在 POM.xml 中定义了测试资源文件夹;这些实际上允许您使用 dataweave 创建 dataweave 单元测试。对于每个测试,为测试创建一个文件夹(例如:appendNsTest),然后在该文件夹中您可以创建一个名为输入的文件夹,您可以为每个输入放置一个文件(例如:payload.jsonvars.json )、out.json/xml/csv/etctransform.dwl。执行 transform.dwl 并将结果与​​ out.* 进行比较。

这太多了,所以我采用了我用于屏幕截图的工作示例并将其发布到此公共存储库:https://github.com/mikeacjones/xml-dw-library