Dataweave 2.0 问题

问题描述 投票:0回答:1

我有一个 MuleSoft 应用程序的输入负载,就像这样......

{
  "P_CUST_ACCOUNTS": [
    {
      "ACCOUNT_NUMBER": 62972,
      "ADDR_CHG_FLAG": "N"
    },
    {
      "ACCOUNT_NUMBER": 94561,
      "ADDR_CHG_FLAG": null
    }
  ]
}

我需要...

检查数组中的每个对象是否包含 ACCOUNT_NUMBER 和 ADDR_CHG_FLAG

检查每个数组对象的 ACCOUNT_NUMBER 值不为空且不是空字符串

检查每个数组对象的 ADDR_CHG_FLAG 值不为 null 且不是空字符串

...并希望根据是否满足上述所有条件简单地返回 true 或 false。

所以在上面的情况下,我会得到一个布尔值true。

到目前为止,我已经能够满足第一个条件...

%dw 2.0
output application/json
import * from dw::core::Arrays
---
{
  acctnbr: payload.P_CUST_ACCOUNTS every ($.ACCOUNT_NUMBER?),
  addrchgflag: payload.P_CUST_ACCOUNTS every ($.ADDR_CHG_FLAG?)
}

...但需要分隔每个字段(如上所示),因为将它们放在一起(如下所示)以获得返回的单个布尔值不会返回正确的值...

if ((payload.P_CUST_ACCOUNTS every ($.ACCOUNT_NUMBER?) == false)
     or (payload.P_CUST_ACCOUNTS every ($.ADDR_CHG_FLAG?) == false)
   ) false
else true

想知道是否有一种方法使用 dataweave 根据是否满足上述所有条件来正确获取单个布尔值。

提前致谢。

尝试过 - 上面详细提到了

mule dataweave mulesoft mule4
1个回答
0
投票

您的主要部分是正确的,使用

every()
函数来检查数组的所有成员是否符合条件。还使用键存在
?
选择器作为第一个条件。

缺少的是把所有条件放在一起。您只需要决定如何在 DataWeave 中表达每个条件,然后由于每个元素都需要符合所有条件,因此只需与

and
运算符连接即可。

为了清楚起见,我将条件的完整表达式放在一个新函数中。


%dw 2.0
output application/json
import * from dw::core::Arrays
fun check(x)=
    x.ACCOUNT_NUMBER? 
    and x.ADDR_CHG_FLAG?
    and isInteger(x.ACCOUNT_NUMBER)
    and (x.ADDR_CHG_FLAG is String)
    and !isEmpty(x.ADDR_CHG_FLAG)
---
payload.P_CUST_ACCOUNTS every ((item) -> check(item))

我假设

ACCOUNT_NUMBER
的正确条件是检查它是否是整数。如果该假设不正确,您可以将其更改为
is String
ADDR_CHG_FLAG

输入负载的输出是

false
,因为最后一个
ADDR_CHG_FLAG
null
,所以它不满足
is String
条件。

© www.soinside.com 2019 - 2024. All rights reserved.