Mule 4:Dataweave2.0:如何将路径作为属性传递以获取数据

Pru*_*i B 1 dataweave mulesoft mule4

dw2.0可以从yaml属性文件中读取路径吗?

例如说输入是

{
  "head": {
    "country": "US",
    "body": {
      "USStates": {
        "stateName": "California",
        "stateCode": "CL"
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我必须从上面的请求中获取 stateCode 值。根据国家名称,路径每次都会改变(如中国国家、印度国家等)

那么有没有办法将输入路径作为参数传递给 Data weave?我们正在使用 yaml 属性。我尝试了下面的代码,它导致空值

%dw 2.0
output application/json
---
if(p("countryName." ++ (payload.head.country as String)) != null)
          payload.p("countryName." ++ (payload.head.country))
else "not in scope"
     
Run Code Online (Sandbox Code Playgroud)

在 yaml 中声明如下

countryName:
  US : head.body.USStates.stateCode
  INDIA : head.body.IndiaStates.stateCode
Run Code Online (Sandbox Code Playgroud)

我什至尝试从有效负载传递路径,然后将其作为字符串。请建议

小智 5

尝试这个:

为了简单起见,我确实使用了路径变量,而不是从 YAML 配置中读取它。

%dw 2.0
output application/json
var data = {
  "head": {
    "country": "US",
    "body": {
      "USStates": {
        "stateName": "California",
        "stateCode": "CL"
      }
    }
  }
}

var path = "head.body.USStates.stateCode"

---
path splitBy /\./ reduce (e,acc=data) -> acc[e]
Run Code Online (Sandbox Code Playgroud)

编辑:如果您需要解释,请询问,我稍后会重新编辑所有详细信息。现在没时间:)。

Edit1:看看这个答案的解释reduce

  • “reduce”是一个迭代器,它接受一个数组并传递当前迭代返回的任何内容以及下一个项目。它遍历数组中的每个项目,在本例中为“['head', 'body', 'USStates', 'stateCode']”。累加器是函数返回的内容,并传递给函数的下一次迭代。因此,当您迭代路径的各个部分时,累加器将与对象的特定部分一起返回。因此,在第一次迭代中,您将返回 `{ "country": ..., "body": ...`。然后在下一个 `{ "USStates": ...` 上,依此类推。@普鲁德维B (2认同)