Как определить значения массива в YAML и получить ключи — Mule 4

#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 динамически на основе устанавливаемой переменной.