我有一个 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 根据是否满足上述所有条件来正确获取单个布尔值。
提前致谢。
尝试过 - 上面详细提到了
您的主要部分是正确的,使用
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
条件。