如何在DataWeave 2.0中基于apiId键合并JSON对象
使用DataWeave 2.0基于apiId合并JSON数组
需求说明
原始JSON结构:
[{ "apiId": 18211158, "policyName0": "cors" }, { "apiId": 18211158, "policyName1": "client-id-enforcement" }, { "apiId": 18211150, "policyName0": "client-id-enforcement" }, { "apiId": 18211162, "policyName0": "client-id-enforcement" }, { "apiId": 18211162, "policyName1": "cors" }, { "apiId": 18211162, "policyName2": "oauth" }]
需要将其转换为按apiId合并后的结构,把同一apiId对应的所有policyName属性合并到同一个对象中:
[{ "apiId": 18211158, "policyName0": "cors", "policyName1": "client-id-enforcement" }, { "apiId": 18211150, "policyName0": "client-id-enforcement" }, { "apiId": 18211162, "policyName0": "client-id-enforcement", "policyName1": "cors", "policyName2": "oAuth" }]
解决方案代码
基础合并版本
%dw 2.0 output application/json --- payload groupBy ($.apiId) mapObject ((value, key) -> { apiId: key, (value flatMap ((item) -> item - "apiId")) }) pluck $
包含大小写修正的版本
如果需要把oauth统一修正为oAuth,可以使用下面的代码:
%dw 2.0 output application/json --- payload groupBy ($.apiId) mapObject ((value, key) -> { apiId: key, (value flatMap ((item) -> item - "apiId" mapObject ((val, k) -> (k): if (val == "oauth") then "oAuth" else val ) )) }) pluck $
代码解释
- 分组归类:
groupBy ($.apiId)将原始数组按apiId分组,生成一个以apiId为键、对应同ID所有条目组成的数组为值的对象。 - 合并属性:通过
mapObject遍历每个分组,先保留apiId字段,再用flatMap把分组内每个条目去掉apiId后,将所有policyName属性扁平合并到同一个对象中。 - 转回数组:最后用
pluck $把处理后的对象转换为数组结构,得到最终的合并结果。
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

