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

如何在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)

代码解释:

  1. getChangedFields函数:这是核心的递归处理函数,负责遍历嵌套结构:

    • 当遇到对象类型时,递归检查每个键对应的新旧值,过滤掉没有变化的键(值为null或空对象的项)。
    • 当遇到基本类型(字符串、数字等)时,只有新旧值不同才返回新值,否则返回null。
  2. compare函数:负责将差异转换成你想要的格式:

    • 调用getChangedFields获取新对象中的变化字段,再反向调用一次获取旧对象中对应的变化字段。
    • 把这些差异包装成oldValue和newValue的结构,并放在数组中,最后过滤掉没有任何变化的父字段。

运行这段代码后,输出结果正好是你预期的:

{"b": [{"oldValue": {"d": "egg"}, "newValue": {"d": "eagle"}}]}

这样就完美过滤掉了未更新的c:"dog"字段,只保留了真正变化的内容。

内容的提问来源于stack exchange,提问作者San

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 22:02:26