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

Mule 4中JSON指定字段掩码处理及代码多余节点问题排查

Mule 4 DataWeave JSON字段脱敏问题修复

问题说明

需要在Mule 4中处理任意层级的JSON请求(支持对象或数组类型),将所有字段名包含NAME或Number的字段值替换为******。例如{"firstName": "John"}需处理为{"firstName": "******"}。

原代码执行后会给非目标字段添加0或1作为默认根节点,无法得到正确结构。以下是示例请求与预期输出:

示例请求

{
    "smrSysten": {
        "smrDetails": {
            "smrName": "DTI01922",
            "status": "Active"
        },
        "ownerDetails": {
            "firstName": "John Mike",
            "languagePreferences": [
                "English",
                "Russian"
            ]
        },
        "secondOwnerDetails": [
            {
                "NameProvided": "Will Jack",
                "languagePreferences": [
                    "English",
                    "Spanish"
                ]
            }
        ]
    }
}

预期输出

{
    "smrSysten": {
        "smrDetails": {
            "smrName": "******",
            "status": "Active"
        },
        "ownerDetails": {
            "firstName": "******",
            "languagePreferences": [
                "English",
                "Russian"
            ]
        },
        "secondOwnerDetails": [
            {
                "NameProvided": "******",
                "languagePreferences": [
                    "English",
                    "Spanish"
                ]
            }
        ]
    }
}

原代码问题分析

原代码的核心错误出在数组处理逻辑:

  • 使用value map { ($$) : maskMessage($$,$) }处理数组时,$$代表数组的索引(0、1...),这会把数组转换成以索引为键的对象,导致输出结构混乱,出现额外的0/1键。
  • 数组元素不需要传递索引作为键名,因为只有对象的字段名才是判断是否脱敏的依据,数组本身的元素只需递归处理内部结构即可。
  • masking函数中!isEmpty(val) and (sizeOf(val)>0)存在冗余,isEmpty(val)已经能判断值是否为空或长度为0。

修复后的DataWeave代码

%dw 2.0
output application/json

// 脱敏逻辑:如果键名包含NAME/NUMBER且值非空,替换为******
fun masking(key, val) = 
    if (!isEmpty(val) and (upper(key) contains "NAME" or upper(key) contains "NUMBER")) 
        "******" 
    else 
        val

// 递归处理JSON结构
fun maskMessage(keyName, value) = 
    // 处理对象:遍历每个键值对,递归处理值
    if (typeOf(value) is Object) 
        value mapObject { ($$): maskMessage($$ as String, $) }
    // 处理数组:递归处理每个数组元素,保持数组结构
    else if (typeOf(value) is Array) 
        value map maskMessage("", $)
    // 处理字符串:调用脱敏函数
    else if (typeOf(value) is String) 
        masking(keyName, value)
    // 其他类型(数字、布尔等)直接返回
    else 
        value
---
maskMessage("", payload)

代码修改说明

  1. 数组处理优化:将数组处理逻辑改为value map maskMessage("", $),直接递归处理每个数组元素,保留原数组结构,避免将数组转为对象。
  2. 类型判断优化:使用typeOf(value) is Object替代typeOf(value) as String == "Object",更符合DataWeave的类型判断规范。
  3. 脱敏函数简化:去掉冗余的sizeOf(val)>0判断,isEmpty(val)已覆盖空字符串、空数组等场景。
  4. 键名大小写统一:通过upper(key)统一将键名转为大写,确保name、Number等不同大小写的字段都能被匹配到。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 19:43:10