You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

报错原因

  1. 类型不匹配:filterObject要求过滤条件返回布尔值,但原脚本中keys filter ((item, index) -> item == key)返回的是数组(匹配到的键组成的数组)。当没有匹配项时返回空数组[],DataWeave无法将空数组强制转换为布尔值,触发报错。
  2. 逻辑方向错误:原脚本试图过滤对象中存在的必填键对应的键值对,和“找出缺失的必填键”的需求完全相反。
  3. 检查范围错误:必填键包含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)

脚本解释

  1. 获取所有现有键:使用pluck操作分别提取顶层和messageList[0]中的键,合并成所有现有键的集合。
  2. 筛选缺失键:通过filter和in操作符,找出必填键中不在现有键集合里的项,即为缺失的键。
  3. 类型安全:所有条件判断返回布尔值,避免了类型转换错误。

补充说明

如果只需要检查特定层级的键,可调整allExistingKeys的生成逻辑:

  • 仅检查顶层:var allExistingKeys = payload pluck ($$ as String)
  • 仅检查messageList[0]:var allExistingKeys = payload.req.messageList[0] pluck ($$ as String)

内容的提问来源于stack exchange,提问作者veejay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 23:45:37