如何在 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"
我正在尝试在 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"