在MuleSoft中使用DataWeave实现JSON动态值映射
动态字段映射需求
需将输入JSON载荷与映射JSON对象通过country字段关联,使用对应映射的JSON路径动态提取输入字段,生成目标JSON。每条输入记录需根据自身country匹配对应的映射结构。
输入Payload
[ { "user" : "User1", "city" : "City1", "country": "ABC", "details": { "name": "John1", "age": 30 } }, { "user" : "User2", "city" : "City2", "country": "XYZ", "details": { "name": "Joe", "age": 40 } } ]
映射变量(按country关联)
var Mappings = [ { "country": "ABC", "user" : "payload.user", "city" : "payload.city", "name" : "payload.details.name", "age" : "payload.details.age" }, { "country": "XYZ", "user" : "payload.user", "name" : "payload.details.name", "age" : "payload.details.age" } ]
注:原映射代码存在语法错误,已修正为合法数组结构
预期输出
[ { "user": "User1", "city": "City1", "country" : "ABC", "name" : "John1", "age" : 30 }, { "user": "User2", "country" : "XYZ", "name" : "Joe", "age" : 40 } ]
可行的DataWeave解决方案
%dw 2.0 output application/json // 修正后的合法映射变量 var Mappings = [ { "country": "ABC", "user" : "payload.user", "city" : "payload.city", "name" : "payload.details.name", "age" : "payload.details.age" }, { "country": "XYZ", "user" : "payload.user", "name" : "payload.details.name", "age" : "payload.details.age" } ] --- payload map (item) -> do { // 匹配当前记录对应的映射规则 var matchedMapping = Mappings filter ($.country == item.country)[0] // 遍历映射键值对,动态提取字段值 var mappingEntries = matchedMapping pluck ((value, key) -> if (key != "country") { (key): read(value, "application/dw", {"payload": item}) } else { (key): value } ) // 将分散的键值对合并为单个目标对象 mappingEntries reduce ((entry, acc = {}) -> acc ++ entry) }
代码说明
- 用
map遍历输入的每条记录 - 通过
filter精准匹配当前记录对应country的映射规则 - 借助
pluck遍历映射键值对,使用read函数结合当前记录作为上下文,解析JSON路径并提取对应值 - 最后用
reduce将零散的键值对合并为完整的目标对象
内容的提问来源于stack exchange,提问作者Shree
相关产品推荐
相关产品推荐

