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

如何设置JsonElement的值?实现JSON文档密码属性通用脱敏方法

JSON密码属性掩码处理:如何修改JSON元素值

你的核心问题在于**JsonDocument和JsonElement是只读结构**,无法直接修改它们的属性值,所以property.Value = new string('*', strValue.Length)这行代码根本无法执行。

改用.NET 6及以上支持的JsonNode来实现,它是可读写的JSON对象模型,更适合做这种递归修改操作。下面是重构后的完整代码:

private string MaskPassword(string json)
{
    var node = JsonNode.Parse(json);
    if (node == null) return json;

    MaskPasswordNode(node);
    return node.ToJsonString();
}

private void MaskPasswordNode(JsonNode node)
{
    // 处理JSON数组:递归处理每个元素
    if (node is JsonArray array)
    {
        foreach (var item in array)
        {
            MaskPasswordNode(item);
        }
        return;
    }

    // 处理JSON对象:遍历所有属性,匹配密码字段并掩码
    if (node is JsonObject obj)
    {
        foreach (var property in obj.ToList()) // 用ToList避免遍历中修改集合报错
        {
            var propertyName = property.Key;
            var propertyValue = property.Value;

            // 匹配包含password的字段(忽略大小写),且值是字符串类型
            if (propertyName.Contains("password", StringComparison.OrdinalIgnoreCase) &&
                propertyValue is JsonValue value && value.ValueKind == JsonValueKind.String)
            {
                var strValue = value.GetString();
                if (!string.IsNullOrWhiteSpace(strValue))
                {
                    // 直接修改JsonNode的值为掩码字符串
                    obj[propertyName] = new string('*', strValue.Length);
                }
            }
            else
            {
                // 递归处理嵌套的对象或数组
                MaskPasswordNode(propertyValue);
            }
        }
    }
}

关键说明:

  • 把原方法的void改成返回string,因为字符串是值类型,原代码里的赋值无法改变外部传入的字符串内容,必须返回修改后的结果。
  • 用JsonNode统一处理数组和对象,递归遍历所有嵌套层级,确保深层的密码字段也能被掩码。
  • 遍历JsonObject时用ToList(),避免在遍历过程中修改集合导致的异常。
  • 直接通过obj[propertyName]赋值修改属性值,这是JsonNode支持的可写操作。

调用示例:

var originalJson = @"{""user"":""admin"",""password"":""123456"",""details"":{""apiKey"":""abc"",""secretPassword"":""789""}}";
var maskedJson = MaskPassword(originalJson);
// 输出结果:{"user":"admin","password":"******","details":{"apiKey":"abc","secretPassword":"***"}}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 07:52:38