如何使用Newtonsoft.Json在C#中反序列化JSON?反序列化后book为null
解决Newtonsoft.Json反序列化时book字段为null的问题
book字段反序列化后为null,通常是类/结构体定义与JSON结构不匹配,或者序列化配置问题导致的。下面是具体的解决方案和排查步骤:
1. 确保类结构完全匹配JSON层级
你的JSON是三层嵌套结构:根对象 → catalog对象 → book数组,C#里必须对应定义三层类,且字段名(或通过特性指定)要和JSON一致:
正确的类定义示例
// 对应最外层JSON根节点 public class RootCatalog { public Catalog catalog { get; set; } } // 对应JSON里的catalog节点 public class Catalog { // 属性名需和JSON的"book"完全一致,或用JsonProperty特性指定映射关系 public List<Book> book { get; set; } } // 对应单个book节点 public class Book { public string id { get; set; } public string author { get; set; } public string title { get; set; } public string genre { get; set; } public string price { get; set; } public string publish_date { get; set; } public string description { get; set; } }
反序列化代码
string jsonContent = @"你的JSON字符串内容"; var result = JsonConvert.DeserializeObject<RootCatalog>(jsonContent); // 此时result.catalog.book应包含两个Book对象
2. 排查常见错误点
如果仍出现null,检查以下情况:
- 属性名不匹配:如果C#属性用了大写开头(比如
Books),而JSON里是小写book,可以用[JsonProperty]特性强制绑定:public class Catalog { [JsonProperty("book")] public List<Book> Books { get; set; } } - 类型不匹配:JSON里的
book是数组,C#里必须定义为集合类型(List<Book>、Book[]等),如果写成单个Book对象,会因类型兼容问题导致反序列化失败,字段为null。 - 可访问性问题:类/结构体或属性如果是
private/internal,且未配置序列化器访问权限,会导致无法赋值。确保类和属性都是public,且具备get和set方法。 - JSON格式错误:确认JSON字符串无语法问题(比如逗号遗漏、引号不匹配),可使用在线JSON校验工具验证。
3. 调试技巧
若不确定问题所在,可先将JSON反序列化为JObject手动遍历节点确认结构:
var jsonObj = JsonConvert.DeserializeObject<JObject>(jsonContent); var booksNode = jsonObj["catalog"]["book"]; Console.WriteLine(booksNode.ToString()); // 查看book节点的实际内容
也可开启错误捕获,查看反序列化时的具体异常:
var settings = new JsonSerializerSettings { Error = (sender, args) => { Console.WriteLine($"反序列化错误:{args.ErrorContext.Error.Message}"); args.ErrorContext.Handled = true; // 避免抛出异常中断程序 } }; var result = JsonConvert.DeserializeObject<RootCatalog>(jsonContent, settings);
内容的提问来源于stack exchange,提问作者krdlll
相关产品推荐
相关产品推荐

