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

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

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

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

  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
}

你的项目此时应该看起来像这样:

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

  1. 最后,要使用它,我们现在可以将此模块作为依赖项添加到项目中:
<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.jsonvars.json )、out.json/xml/csv/etctransform.dwl。执行 transform.dwl 并将结果与​​ out.*.

进行比较

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