【问题标题】:How to Define array values in YAML and fetch the keys - Mule 4如何在 YAML 中定义数组值并获取键 - Mule 4
【发布时间】:2022-01-03 09:43:59
【问题描述】:

我正在尝试在 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 中的列表,以便我可以在 dw 中使用 (p('list') 进行循环。骡子不喜欢也可以。

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

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

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

【问题讨论】:

    标签: yaml mule dataweave mule4


    【解决方案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 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
      

      根据 vars.code 的值,这将返回一个不包含或包含一个项目的字符串数组。为了返回 null 或角色,您可以使用以下 DataWeave 表达式:

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

      这是技术部分。

      看来您要实现的是检查输入有效负载中是否存在 vars.code 中包含的角色(如果 list.roles 中存在 vars.code 值,则 DataWeave 表达式将返回完全相同的 vars。代码值)。如果是这种情况,可以调整 DataWeave 表达式以返回一个布尔值,告知角色是否存在于角色列表中。您可以使用以下 DataWeave 表达式实现此目的:

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

      【讨论】:

      • 感谢您提供详细信息。对不起,如果我的问题让你感到困惑。基本上当一个变量有finance 表达式应该提取'角色',如果变量是emp1 应该提取employee。是否有表达式通过p('list) 列表并根据设置的变量动态获取key
      猜你喜欢
      • 2020-02-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多