如何在Mule 4中用DataWeave将子键值移至父键(动态键场景)
Mule 4中动态JSON结构转换实现方案
输入JSON
[ { "abc": { "s": "123" }, "pqr": { "s": "234" }, "xyz": { "s": "345" } }, { "abc": { "s": "456" }, "pqr": { "s": "567" } } ]
期望输出JSON
[ { "abc": "123", "pqr": "234", "xyz": "345" }, { "abc": "456", "pqr": "567", "xyz": null } ]
实现思路与步骤
由于输入JSON的键是动态的,且数组内不同对象可能缺失部分键,需要先收集所有可能出现的键,再统一映射转换:
- 提取所有唯一键:遍历输入数组的全部对象,取出所有属性名并去重,确保覆盖所有潜在键(如abc、def、pqr、mno、xyz等)。
- 逐个转换对象:对原数组中的每个对象,遍历所有唯一键,若对象存在该键则取其嵌套的
s属性值,不存在则赋值为null。
DataWeave 脚本实现
在Mule 4的Transform组件中使用以下代码:
%dw 2.0 output application/json // 提取所有唯一键集合 var allKeys = payload flatMap ((item) -> item pluck $$) distinctBy $ --- payload map ((item) -> allKeys reduce ((key, acc = {}) -> acc ++ { (key): item[key]?.s default null } ) )
代码说明
allKeys:通过flatMap遍历每个对象,pluck $$提取对象的所有键名,再用distinctBy $去重,得到完整的键集合。payload map:遍历原数组中的每个待转换对象。allKeys reduce:遍历所有唯一键,动态构建新对象:(key)实现动态键名,item[key]?.s安全访问嵌套属性,default null保证缺失键时赋值为null。
内容的提问来源于stack exchange,提问作者soumya
相关产品推荐
相关产品推荐

