如何用DataWeave验证Mule 4中列表元素是否符合所有条件
用DataWeave验证数组对象所有条件并返回单个布尔值
输入载荷
{ "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,推测实际需求允许该字段值为null,仅需确保不为空字符串,后续代码适配此场景)
问题分析
你之前合并条件的写法逻辑冗余且易出错,核心问题是没利用好every操作符的特性——every可直接对数组每个元素同时验证多条件,只有所有元素满足全部条件时才返回true,否则返回false。
正确实现代码
%dw 2.0 output application/json --- payload.P_CUST_ACCOUNTS every ( // 条件1:两个字段均存在 $.ACCOUNT_NUMBER? and $.ADDR_CHG_FLAG? // 条件2:ACCOUNT_NUMBER非空且不为空内容 and !isEmpty($.ACCOUNT_NUMBER) // 条件3:ADDR_CHG_FLAG不为空字符串(允许null,匹配示例返回true的要求) and (isEmpty($.ADDR_CHG_FLAG as String) == false or $.ADDR_CHG_FLAG == null) )
代码解释
every操作符:遍历P_CUST_ACCOUNTS数组的每个对象,仅当所有对象都满足括号内全部条件时,最终结果为true。- 字段存在验证:
$.ACCOUNT_NUMBER?和$.ADDR_CHG_FLAG?检查对象是否包含对应字段,返回布尔值。 - ACCOUNT_NUMBER非空验证:
!isEmpty($.ACCOUNT_NUMBER)确保字段值不是null、空字符串或空集合等空值。 - ADDR_CHG_FLAG验证:结合示例需求,判断“不为空字符串”或“为null”;若实际需求为严格非空(不允许null),可修改为
!isEmpty($.ADDR_CHG_FLAG as String)。
严格非空场景简化写法
如果要求ADDR_CHG_FLAG必须非null且不为空字符串,可使用以下代码:
%dw 2.0 output application/json --- payload.P_CUST_ACCOUNTS every ( $.ACCOUNT_NUMBER? and !isEmpty($.ACCOUNT_NUMBER) and $.ADDR_CHG_FLAG? and !isEmpty($.ADDR_CHG_FLAG as String) )
内容的提问来源于stack exchange,提问作者airmail
相关产品推荐
相关产品推荐

