You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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)

代码解释

  1. 递归函数定义:mergeIds函数负责处理单个对象,支持深层嵌套的递归调用,确保所有层级的ID都能被处理。
  2. 分组重复键:用groupBy将对象中相同键的值归为一组,这样所有重复的ID会被集中到同一组内,方便后续合并。
  3. 合并ID对象:当遇到ID键时,通过reduce遍历分组内的所有ID对象,将每个对象的type作为新键、value作为对应值,逐步合并成一个新的ID对象。
  4. 递归处理子对象:如果当前键对应的值是对象,就递归调用mergeIds处理这个子对象,保证嵌套层级里的ID也能被正确合并。
  5. 保留非对象类型:对于字符串、数字等非对象类型的值,直接保留原值即可,无需额外处理。

内容的提问来源于stack exchange,提问作者Mule-Newbie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 05:12:37