#yaml #mule #dataweave #mule4
Вопрос:
Я пытаюсь определить массив в конфигурации Mule YAML для динамического извлечения на key
основе значения.
Например, у меня есть переменная потока code= finance
. Используйте код для перебора списка для извлечения ключа roles
(пример ниже). аналогично, если переменная имеет значение ’emp1′, следует извлечь ключ employee
.
Отредактированные вопросы для большей ясности.
Конфигурация YAML:
list:
roles:
- admin
- finance
- hr
- sales
employee:
- emp1
- emp2
- emp3
Попытался переопределить файл YAML, как описано на этой странице https://www.w3schools.io/file/yaml-multiline-arrays / как показано ниже (см. ---
раздел, чтобы отличить это как список в YAML, чтобы я мог использовать (p('list')
в dw для перебора. Mule это тоже не понравилось.
list:
---
roles:
- admin
- finance
- hr
- sales
employee:
- emp1
- emp2
- emp3
Mule это не нравится или как определить многострочный массив и получить ключ динамически?
Любые советы и мысли?
Пожалуйста, дайте мне знать, если вопрос неясен. Спасибо
Ответ №1:
Я понимаю, что вы хотите найти ключ во входном YAML для заданного значения. Вы можете использовать функцию findKeyForValue() ниже. Он пересекает объекты и массивы, чтобы найти значение, а затем возвращает ключ, которому принадлежит значение. Это может потребовать изменений для более сложных структур.
%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"
Ответ №2:
Функция splitBy разбивает заданную строку на основе значения, которое соответствует части этой строки.
Если вы измените выражение 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
Это вернет массив строк, не содержащих ни одного или одного элемента, в зависимости от значения vars.code . Чтобы вернуть значение null или роль, вы можете использовать следующее выражение DataWeave:
%dw 2.0
output application/java
---
((p('list.roles') default []) filter $ == vars.code)[0]
Это для технической части.
Похоже, что вы пытаетесь проверить, существует ли роль, содержащаяся в vars.code, во входной полезной нагрузке (если значение vars.code существует в list.roles, выражение DataWeave вернет точно такое же значение vars.code). Если это так, выражение DataWeave можно настроить так, чтобы возвращать логическое значение, указывающее, существует ли роль в списке ролей. Вы можете добиться этого, используя следующее выражение для сохранения данных:
%dw 2.0
output application/java
---
isEmpty((p('list.roles') default []) filter $ == vars.code)
Комментарии:
1. Спасибо за подробности. Извините, если мой вопрос вас смутил. В основном, когда переменная имеет
finance
выражение, следует извлекать «роли», и если переменнаяemp1
должна извлекатьсяemployee
. Есть ли в любом случае выражение для просмотра спискаp('list)
и полученияkey
динамически на основе устанавливаемой переменной.