【问题标题】:Key Existence in JSON Object (Mule 4)JSON对象中的关键存在(Mule 4)
【发布时间】:2020-10-01 06:04:31
【问题描述】:

我需要检查 JSON 对象中是否存在特定关键字,并在此基础上创建一个字符串。我的示例 dataweave 2.0 代码如下:

%dw 2.0
output application/json
var arr = {
    "ID": "100",
    "ProdId": "Prod",
    "ProdName": "ABC"
           }
---
if (arr pluck $$ joinBy ';' contains "ProdId") == true
    then (String: "Product") else
if (arr pluck $$ joinBy ';' contains "EmpId") == true
    then (String: "Employee") else null

根据变量的值,我需要有不同的字符串值。上面需要什么改变才能工作?

【问题讨论】:

    标签: mule mule-studio dataweave mule-component anypoint-studio


    【解决方案1】:

    我正在考虑使用“keysOf”函数(以前的 Object::keySet)和类似的东西:

    %dw 2.0
    output application/json
    var arr = {
        "ID": "100",
        "ProdId": "Prod",
        "ProdName": "ABC"
               }
    ---
    if (keysOf(arr) contains("ProdId" as Key)) "Product"
    else if (keysOf(arr) contains("EmpId" as Key)) "Employee"
    else "Not Recognized"
    

    请注意,“keysOf”返回的是 Key 对象数组,而不是字符串。

    编辑:

    一种更动态的方法可以是这个:

    %dw 2.0
    output application/json
    import firstWith from dw::core::Arrays
    var arr = {
        "ID": "100",
        "ProdId": "Prod",
        "ProdName": "ABC"
               }
    var myTypes = {
        ProdId: "Product",
        EmpId: "Employee"
    }
    var typeId = (keysOf(myTypes) firstWith (keysOf(arr) contains $)) as String
    ---
    myTypes[typeId]
    

    【讨论】:

      【解决方案2】:

      您可以利用字段存在运算符?

      %dw 2.0
      output application/json
      var o = {
          "ID": "100",
          "ProdId": "Prod",
          "ProdName": "ABC"
      }
      ---
      if (o.ProdId?) (String: "Product") else 
          if (o.EmpId?) (String: "Employee") else null
      

      您也可以使用 match 运算符解决模式匹配问题:

      %dw 2.0
      output application/json
      var o = {
          "ID": "100",
          "ProdId": "Prod",
          "ProdName": "ABC"
      }
      ---
      "ProdId" match {
          case "ProdId" -> "String": "Product"
          case "EmpId"  -> "String": "Employee"
          else -> null
      }
      

      这是文档:

      您还需要注意String 是 DW 中的一种类型,您必须将其括在引号中("')才能用作字段名称。

      【讨论】:

      • 第二个例子应该匹配一个字符串吗?还是应该改为变量o
      • 可以是String,也可以是变量,也可以是Key,可以是以上所有——这就是模式匹配Aled的力量!当然,如果您想结合以上所有内容,则应调整 cases 以​​涵盖所有不同的输入。
      • 我的意思是脚本中没有使用该变量。它似乎是从上一个示例中复制的。是不是无意留下的?
      • 哦,我明白你的意思了。是的,我确实跳过了几个步骤(即如何访问字段然后应用它们进行匹配),因为这些字段首先是硬编码的。
      猜你喜欢
      • 1970-01-01
      • 2021-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-20
      • 1970-01-01
      • 2020-06-13
      • 2022-12-05
      相关资源
      最近更新 更多