如何在DataWeave中根据diff返回的路径定位原始负载对应字段
解决方案
核心思路是先把diff返回的字符串格式路径解析为可动态访问的路径段数组,再通过遍历路径段从目标payload中读取对应值。
实现代码
%dw 2.0 output application/json // 解析diff返回的路径字符串,转换为包含字段名、数组索引的路径段数组 fun parsePath(pathStr: String) = pathStr replace /^\(root\)\./ with "" splitBy /(?=\[)|\./ map ((segment) -> if (segment startsWith "[") (segment replace /\[|\]/ with "") as Number else segment ) // 根据路径段数组,从目标对象中动态读取对应值 fun getValueByPath(target: Any, pathSegments: Array<Any>) = pathSegments reduce ((segment, acc = target) -> acc[segment]) --- // 此处diffResult为diff函数返回的结果,newPayload为你对比的第二个payload,可根据实际变量名调整 diffResult.diffs map (diffItem) -> do { var fullPath = parsePath(diffItem.path) var parentNodePath = fullPath[0 to -2] // 去掉最后一级变更字段,拿到父节点路径 var changedField = fullPath[-1] { name: getValueByPath(newPayload, parentNodePath + "name"), (changedField): diffItem.actual, // 示例中level按数组所在层级计数,如需按原路径拆分后的层级计算可替换为 sizeOf(fullPath) - 2 level: sizeOf(parentNodePath filter ((item) -> item is Number)) } }
逻辑说明
- 路径解析函数会把示例中的
(root).group1[2].enabled转换为["group1", 2, "enabled"]格式的数组,字符串为字段名,数字为数组索引 - 动态取值函数通过
reduce遍历路径段,逐层从payload中读取值,无需硬编码路径 - 取父节点路径后拼接
name字段,即可直接读取变更节点所属的数组元素的name值 - 示例中level的计算逻辑统计路径中出现的数组索引数量,刚好匹配你给出的示例输出要求,可根据实际业务规则调整计算逻辑。
内容的提问来源于stack exchange,提问作者DamienS
相关产品推荐
相关产品推荐

