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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 04:35:33