如何用DataWeave移除JSON对象重复键?合并数组后遇重复键问题
DataWeave合并对象数组时移除重复键的解决方案
当你基于公共字段合并两个对象数组时,若出现重复键(如示例中的id),可以通过以下几种方式解决:
原因分析
你当前的脚本使用item2 ++ item合并对象,但两个对象都包含id键,导致生成的对象出现重复键。虽然严格来说JSON不允许重复键,但DataWeave在某些场景下可能会保留这类结构,我们需要通过合理的合并方式避免这种情况。
解决方案1:利用对象合并的覆盖特性优化脚本
DataWeave中++操作符合并对象时,右侧对象的同名键会覆盖左侧的。我们可以调整合并顺序,同时改用更高效的innerJoin(内连接)来替代map+filter,直接获取两个数组的交集并合并:
%dw 2.0 import * from dw::core::Arrays output application/json var array1 = [ { "id": 1, "name": "John" }, { "id": 2, "name": "Jane" } ] var array2 = [ { "id": 1, "age": 30 }, { "id": 3, "age": 25 }, { "id": 2, "age": 25 } ] // 内连接两个数组,匹配id相同的对象 var mergedArray = innerJoin(array1, array2, (a) -> a.id, (b) -> b.id) // 合并对象:用array1的对象(l)作为基础,合并array2的对象(r),同名键会被右侧覆盖(此处id值一致,不影响结果) map (({l, r}) -> l ++ r) --- mergedArray
输出结果
[ { "id": 1, "name": "John", "age": 30 }, { "id": 2, "name": "Jane", "age": 25 } ]
解决方案2:显式构造合并对象(更直观)
如果需要明确控制每个字段的来源,可以直接构造新对象,避免任何潜在的重复键问题:
%dw 2.0 import * from dw::core::Arrays output application/json var array1 = [ { "id": 1, "name": "John" }, { "id": 2, "name": "Jane" } ] var array2 = [ { "id": 1, "age": 30 }, { "id": 3, "age": 25 }, { "id": 2, "age": 25 } ] var mergedArray = innerJoin(array1, array2, (a) -> a.id, (b) -> b.id) map (({l, r}) -> { id: l.id, // 明确指定id来自array1(或r.id,两者值一致) name: l.name, age: r.age }) --- mergedArray
对原脚本的修复
如果你想保留原脚本的map+filter结构,只需调整合并顺序,确保重复键被覆盖:
%dw 2.0 import * from dw::core::Arrays output application/json var array1 = [ { "id": 1, "name": "John" }, { "id": 2, "name": "Jane" } ] var array2 = [ { "id": 1, "age": 30 }, { "id": 3, "age": 25 }, { "id": 2, "age": 25 } ] var mergeArray = array1 map((item) -> array2 filter((item2) -> item2.id == item.id) map (item2) -> item ++ item2 // 调整合并顺序,item的键会被item2的同名键覆盖(id值一致,结果唯一) ) --- flatten(mergeArray)
内容的提问来源于stack exchange,提问作者Abhishek Kumar
相关产品推荐
相关产品推荐

