DataWeave代码优化:处理目标API无rows返回场景
解决DataWeave中目标API无rows字段时的响应生成问题
需求回顾
需要将输入负载数组与目标API的输出负载通过id字段匹配,生成带状态的最终响应:
- 当API返回包含
rows字段时,按原逻辑匹配每个输入id的处理状态 - 当API无
rows字段(全错误场景)时,为每个输入id添加API返回的统一错误信息
优化后的DataWeave代码
%dw 2.0 output application/json // 替换为你实际存储目标API响应的变量(比如vars.apiResponse或payload) var apiResponse = vars.apiResponse default {} // 构建结果映射:有rows则生成id->处理结果的映射,无rows则生成错误信息对象 var resultLookup = if (apiResponse.rows != null and sizeOf(apiResponse.rows) > 0) // 将rows数组转为id为键的映射表,快速匹配 apiResponse.rows groupBy $.id mapObject ((val, key) -> (key): val[0]) else // 提取API返回的错误信息,默认值处理避免空指针 { status: "FAILED", errorCode: apiResponse.errorCode default "UNKNOWN_ERROR", errorMessage: apiResponse.errorMessage default "请求处理失败" } --- // 遍历输入负载,为每个id生成带状态的响应 payload map (item) -> { id: item.id, // 根据resultLookup的类型决定返回成功匹配结果还是错误信息 (if (resultLookup.errorCode != null) resultLookup else // 匹配成功则返回对应结果,未匹配则返回默认失败信息 resultLookup[item.id] default { status: "FAILED", errorMessage: "未找到对应处理记录" }) }
代码关键说明
- 空值安全处理:用
default {}确保API响应为空时不会报错,同时给错误字段设置默认值,避免缺失字段导致的异常 - 分支逻辑清晰:通过判断
rows的存在性和长度,区分正常响应和全错误场景 - 高效匹配:正常场景下将
rows转成id为键的映射表,避免遍历查找,提升性能 - 统一输出结构:无论哪种场景,最终输出的每个项都包含
id和状态相关字段,保证响应结构一致性
测试示例
场景1:目标API返回全错误(无rows)
输入负载:
[ {"id": "101"}, {"id": "102"} ]
API响应:
{ "errorCode": "503", "errorMessage": "服务暂时不可用" }
最终输出:
[ { "id": "101", "status": "FAILED", "errorCode": "503", "errorMessage": "服务暂时不可用" }, { "id": "102", "status": "FAILED", "errorCode": "503", "errorMessage": "服务暂时不可用" } ]
场景2:目标API返回正常rows数据
输入负载同场景1
API响应:
{ "rows": [ {"id": "101", "status": "SUCCESS", "result": "处理完成"} ] }
最终输出:
[ { "id": "101", "status": "SUCCESS", "result": "处理完成" }, { "id": "102", "status": "FAILED", "errorMessage": "未找到对应处理记录" } ]
内容的提问来源于stack exchange,提问作者subhash
相关产品推荐
相关产品推荐

