如何设置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
相关产品推荐
相关产品推荐

