如何在 YAML 中定义数组值并获取键 - Mule 4

How to Define array values in YAML and fetch the keys - Mule 4

我正在尝试在 Mule YAML 配置中定义数组以根据值动态检索 key

比如我有一个流变量code= finance。使用代码循环遍历列表以获取键 roles(下例)。同样,如果变量有 'emp1' 应该获取键 employee.

编辑问题以更加清晰。

YAML 配置:

list:
  roles:
    - admin
    - finance
    - hr
    - sales
  employee:
    - emp1
    - emp2
    - emp3

尝试按照本页 https://www.w3schools.io/file/yaml-multiline-arrays/ 中的描述重新定义 YAML 文件,如下所示(请参阅 --- 将其区分为 YAML 中的列表,以便我可以在 dw 中使用 (p('list')循环播放。骡子也不喜欢。

list:
---
  roles:
    - admin
    - finance
    - hr
    - sales
  employee:
    - emp1
    - emp2
    - emp3

骡子不喜欢或者如何定义多行数组并动态获取密钥? 有什么建议和想法吗?

如果问题不清楚,请告诉我。谢谢

splitBy function 根据与该字符串的一部分匹配的值拆分给定的字符串。

如果您将 DataWeave 表达式更改为:

%dw 2.0
output json
---
p('list.roles')

输出将是字符串数组:

[
  "admin",
  "finance",
  "hr",
  "sales"
]

因此,您的 DataWeave 表达式试图做的是对数组应用 splitBy 函数,这是行不通的。

为了使您的 DataWeave 表达式起作用,您需要直接应用过滤器,如以下 DataWeave 表达式所示:

%dw 2.0 
output application/java
---
p('list.roles') filter $ == vars.code

这将 return 包含 none 或一项的字符串数组,具体取决于 vars.code 值。为了return null 或作用,可以使用下面的DataWeave 表达式:

%dw 2.0
output application/java
---
((p('list.roles') default []) filter $ == vars.code)[0]

这是技术部分。

看来你想要实现的是检查输入负载中是否存在 vars.code 中包含的角色(如果 vars.code 值存在于 list.roles 中,DataWeave表达式将 return 完全相同的 vars.code 值)。如果是这种情况,DataWeave 表达式可以调整为 return 一个布尔值,指示该角色是否存在于角色列表中。您可以使用以下 DataWeave 表达式实现此目的:

%dw 2.0
output application/java
---
isEmpty((p('list.roles') default []) filter $ == vars.code)

我了解到您想在输入 YAML 中查找给定值的键。您可以使用下面的函数 findKeyForValue()。它遍历对象和数组以找到值,然后 return 值所属的键。可能需要更改更复杂的结构。

%dw 2.0
output application/dw
import * from dw::core::Arrays
fun findKeyForValue(x, v) = do {
    fun findKeyInternal(x,v,lastKeyName) =
        x match {
            case o is Object -> namesOf(o) flatMap findKeyInternal(o[$], v, $) filter $ != null
            case a is Array -> if (a some ($ == v)) lastKeyName else null
            else -> $
        }
    var result=findKeyInternal(x, v, "")
    ---
    if (sizeOf(result)>0) result[0] else null

}
---
findKeyForValue(vars.code, "emp2")

问题输入的输出:

"employee"