如何使用DataWeave合并嵌套JSON中的ID键(按type和value)
使用DataWeave合并嵌套JSON中的重复ID键
问题描述
需要处理任意层级嵌套的JSON数据,将所有重复的ID键(每个ID对象都包含type和value字段)合并为单个ID对象,用type的取值作为键,value的取值作为对应的值,且无需手动构造固定结构。
输入示例
{ "drag": { "misc": { "prog": { "ID": { "type": "name", "value": "ABC" }, "ID": { "type": "standard", "value": "PQR" } } } }, "peak": { "bird": { "tech": { "pl": { "ID": { "type": "room", "value": "123" }, "ID": { "type": "sport", "value": "football" } } } } }, "ID": { "type": "browser", "value": "google" }, "ID": { "type": "day", "value": "Wednesday" } }
预期输出
{ "drag": { "misc": { "prog": { "ID": { "name": "ABC", "standard": "PQR" } } } }, "peak": { "bird": { "tech": { "pl": { "ID": { "room": "123", "sport": "football" } } } } }, "ID": { "browser": "google", "day": "Wednesday" } }
DataWeave解决方案
%dw 2.0 output application/json fun mergeIds(obj: Object): Object = obj groupBy ((value, key) -> key) mapObject ((values, key) -> if (key == "ID") { (key): values reduce ((item, acc) -> acc ++ {(item.type): item.value}) } else if (values[0] is Object) { (key): mergeIds(values[0]) } else { (key): values[0] } ) --- mergeIds(payload)
代码解释
- 递归函数定义:
mergeIds函数负责处理单个对象,支持深层嵌套的递归调用,确保所有层级的ID都能被处理。 - 分组重复键:用
groupBy将对象中相同键的值归为一组,这样所有重复的ID会被集中到同一组内,方便后续合并。 - 合并ID对象:当遇到
ID键时,通过reduce遍历分组内的所有ID对象,将每个对象的type作为新键、value作为对应值,逐步合并成一个新的ID对象。 - 递归处理子对象:如果当前键对应的值是对象,就递归调用
mergeIds处理这个子对象,保证嵌套层级里的ID也能被正确合并。 - 保留非对象类型:对于字符串、数字等非对象类型的值,直接保留原值即可,无需额外处理。
内容的提问来源于stack exchange,提问作者Mule-Newbie
相关产品推荐
相关产品推荐

