如何在C#动态JSON对象的指定嵌套节点添加属性?
实现方案
由于JSON结构动态可变,需要递归遍历所有嵌套对象和数组,找到包含suspiciousSymbols属性的对象,在同一层级添加confidenceLevel: 100。以下是具体实现:
核心递归方法
using Newtonsoft.Json.Linq; public static void AddConfidenceLevel(JToken token) { // 处理对象类型:检查是否含目标属性,同时遍历子属性 if (token is JObject obj) { if (obj.ContainsKey("suspiciousSymbols")) { obj["confidenceLevel"] = 100; } // 递归遍历所有子属性值 foreach (var property in obj.Properties()) { AddConfidenceLevel(property.Value); } } // 处理数组类型:遍历每个元素递归处理 else if (token is JArray array) { foreach (var item in array) { AddConfidenceLevel(item); } } }
完整调用示例
结合你的原始代码,修改后完整代码如下:
using Newtonsoft.Json; using Newtonsoft.Json.Linq; string jsonText = "{\"message\":null,\"hasError\":false,\"errors\":[],\"data\":[{\"version\":\"1.1\",\"documents\":[{\"documentState\":\"Correct\",\"documentData\":{\"name\":\"PassportEEE\",\"type\":\"Document\",\"fields\":[{\"name\":\"test\",\"type\":\"Text\",\"suspiciousSymbols\":\"0000\",\"recognizedValue\":\"test\",\"value\":\"test\"}]},\"documentAsBase64\":\"\"}]}]}"; // 反序列化为JToken(相比dynamic更适合遍历修改操作) JToken data = JsonConvert.DeserializeObject<JToken>(jsonText); // 递归处理所有嵌套对象 AddConfidenceLevel(data); // 转换为格式化后的JSON字符串 string updatedJson = data.ToString(Formatting.Indented); Console.WriteLine(updatedJson);
关键说明
- 选用
JToken而非dynamic:因为dynamic本质是Newtonsoft对JObject/JArray的包装,直接使用JToken类型能更清晰地进行遍历、修改操作,避免动态类型转换的潜在问题。 - 递归逻辑覆盖所有层级:无论
suspiciousSymbols出现在JSON的哪个嵌套深度,递归方法都能准确找到并添加目标属性。 - 修改后可直接序列化:处理后的
JToken可以直接转换为JSON字符串,输出结果完全匹配你期望的结构。
内容的提问来源于stack exchange,提问作者Cagri Tacyildiz
相关产品推荐
相关产品推荐

