DataWeave校验JSON必填键并过滤缺失项报错问题排查
解决DataWeave脚本“Cannot coerce Array ([]) to Boolean”报错问题
问题背景
需求:检查输入JSON是否包含所有必填键,过滤出缺失的键。
输入JSON:
{"req":{ "messageList": [ { "res":1, "id":"test" } ] }}
必填键:
var keys = ["res","req"]
使用的错误脚本:
%dw 2.0 output application/json var keys = ["res"] var p =payload.req.messageList[0] fun getAllAbsentKeys(obj) = obj filterObject ((value, key, index) -> keys filter ((item, index) -> item == key) ) --- getAllAbsentKeys(p)
报错信息:
["req"] Cannot coerce Array ([]) to Boolean
报错原因
- 类型不匹配:
filterObject要求过滤条件返回布尔值,但原脚本中keys filter ((item, index) -> item == key)返回的是数组(匹配到的键组成的数组)。当没有匹配项时返回空数组[],DataWeave无法将空数组强制转换为布尔值,触发报错。 - 逻辑方向错误:原脚本试图过滤对象中存在的必填键对应的键值对,和“找出缺失的必填键”的需求完全相反。
- 检查范围错误:必填键包含
req(顶层键),但原脚本仅检查payload.req.messageList[0]这个嵌套对象,遗漏了顶层键的检查。
修正后的脚本
%dw 2.0 output application/json // 定义所有必填键 var requiredKeys = ["res", "req"] // 获取输入JSON中顶层和messageList[0]的所有键 var allExistingKeys = payload pluck ($$ as String) ++ payload.req.messageList[0] pluck ($$ as String) // 筛选出必填键中不存在于现有键集合中的项 fun getMissingKeys(required, existing) = required filter ((key) -> !(key in existing)) --- getMissingKeys(requiredKeys, allExistingKeys)
脚本解释
- 获取所有现有键:使用
pluck操作分别提取顶层和messageList[0]中的键,合并成所有现有键的集合。 - 筛选缺失键:通过
filter和in操作符,找出必填键中不在现有键集合里的项,即为缺失的键。 - 类型安全:所有条件判断返回布尔值,避免了类型转换错误。
补充说明
如果只需要检查特定层级的键,可调整allExistingKeys的生成逻辑:
- 仅检查顶层:
var allExistingKeys = payload pluck ($$ as String) - 仅检查
messageList[0]:var allExistingKeys = payload.req.messageList[0] pluck ($$ as String)
内容的提问来源于stack exchange,提问作者veejay
相关产品推荐
相关产品推荐

