如何在MuleSoft DataWeave中对比JSON展示需更新的特定字段
解决DataWeave 1.0对比JSON只提取更新字段的问题
我明白你的需求——你现在想要对比两个嵌套JSON对象,只提取实际发生变化的字段,而不是把整个父对象的所有字段都返回。原代码的问题在于没有递归处理嵌套结构,直接把整个子对象当成单一值来对比,所以会把未变化的字段也包含进来。
下面是调整后的DataWeave代码,完全符合你的预期输出:
%dw 1.0 %output application/json %var old = { "b":{ "c":"dog", "d":"egg" } } %var new = { "b":{ "c":"dog", "d":"eagle" } } // 递归遍历对象,只保留有变化的字段 %function getChangedFields(newObj, oldObj) newObj match { :object -> newObj mapObject ((v,k) -> { (k): getChangedFields(v, oldObj[k]) }) filterObject ((v,k) -> v != null && (typeOf(v) != :object || sizeOf(v) > 0) ), default -> (newObj != oldObj) ? newObj : null } // 生成符合预期的格式:将差异包装为包含oldValue和newValue的数组项 %function compare(newObj, oldObj) (getChangedFields(newObj, oldObj) mapObject ((v,k) -> { (k): [{ oldValue: getChangedFields(oldObj[k], newObj[k]), newValue: v }] })) filterObject ((v,k) -> sizeOf(v[0].oldValue) > 0) --- compare(new, old)
代码解释:
getChangedFields函数:这是核心的递归处理函数,负责遍历嵌套结构:- 当遇到对象类型时,递归检查每个键对应的新旧值,过滤掉没有变化的键(值为null或空对象的项)。
- 当遇到基本类型(字符串、数字等)时,只有新旧值不同才返回新值,否则返回null。
compare函数:负责将差异转换成你想要的格式:- 调用
getChangedFields获取新对象中的变化字段,再反向调用一次获取旧对象中对应的变化字段。 - 把这些差异包装成
oldValue和newValue的结构,并放在数组中,最后过滤掉没有任何变化的父字段。
- 调用
运行这段代码后,输出结果正好是你预期的:
{"b": [{"oldValue": {"d": "egg"}, "newValue": {"d": "eagle"}}]}
这样就完美过滤掉了未更新的c:"dog"字段,只保留了真正变化的内容。
内容的提问来源于stack exchange,提问作者San
相关产品推荐
相关产品推荐

