C#使用Json.NET反序列化JSON为自定义规则类时无法读取字段无输出
反序列化失败的核心原因
- 自定义
Rules类定义的属性名是Root,但JSON顶层的键为Rules,属性名和JSON键不匹配,Newtonsoft.Json默认按属性名匹配字段,对应值永远映射不上,rules.Root为空 - 错把包含数组的JSON根对象直接反序列化为单个
Rule实例,结构完全不匹配,得到的rule所有属性都是null,自然打印不出rule.Field的内容 - 未删除结构不匹配的多余反序列化代码,导致取值逻辑错位
修复实现步骤
- 对齐类和JSON的字段映射,二选一即可
- 直接修改
Rules类的属性名和JSON键保持一致:public class Rules { public List<Rule> Rules { get; set; } } - 若需保留原
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
相关产品推荐
相关产品推荐

