You need to enable JavaScript to run this app. C#使用Json.NET反序列化JSON为自定义规则类时无法读取字段无输出
优惠活动
大模型
产品
解决方案
定价
更多

C#使用Json.NET反序列化JSON为自定义规则类时无法读取字段无输出

反序列化失败的核心原因
  • 自定义Rules类定义的属性名是Root,但JSON顶层的键为Rules,属性名和JSON键不匹配,Newtonsoft.Json默认按属性名匹配字段,对应值永远映射不上,rules.Root为空
  • 错把包含数组的JSON根对象直接反序列化为单个Rule实例,结构完全不匹配,得到的rule所有属性都是null,自然打印不出rule.Field的内容
  • 未删除结构不匹配的多余反序列化代码,导致取值逻辑错位
修复实现步骤
  • 对齐类和JSON的字段映射,二选一即可
    1. 直接修改Rules类的属性名和JSON键保持一致:
      public class Rules    
      {
          public List<Rule> Rules { get; set; } 
      }
      
    2. 若需保留原Root属性名,通过JsonProperty特性指定映射的JSON键名:
      using Newtonsoft.Json;
      public class Rules    
      {
          [JsonProperty("Rules")]
          public List<Rule> Root { get; set; } 
      }
      
  • 删除结构不匹配的错误反序列化代码:Rule rule = JsonConvert.DeserializeObject<Rule>(Json);
  • 修正后的核心运行逻辑:
    string RulesFile = "cSharp/rules.js"; 
    string Json = System.IO.File.ReadAllText(RulesFile); 
    var rules = JsonConvert.DeserializeObject<Rules>(Json);
    
    // 正常遍历打印所有层级的规则内容
    foreach (var topRule in rules.Root)
    {
        Console.WriteLine($"顶层规则:Field={topRule.Field}, Test={topRule.Test}");
        foreach (var case1 in topRule.Cases)
        {
            Console.WriteLine($"一级子规则:Field={case1.Field}, Test={case1.Test}");
            foreach (var case2 in case1.Cases)
            {
                Console.WriteLine($"二级子规则:Field={case2.Field}, Test={case2.Test}");
            }
        }
    }
    
  • 注意:JSON中正则表达式的命名捕获组属于字符串内容,Newtonsoft.Json反序列化时会完整保留,无需额外做转义兼容处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.10 07:06:05