使用JsonConvert反序列化JSON到C# Contacts对象时属性值全为null的问题咨询
问题根因
整个反序列化赋值失败的核心原因是JSON数据的层级结构和你反序列化的目标类完全不匹配,具体错位点:
- 你提供的JSON顶层节点是带分页元数据的分页响应结构:顶层包含
currentPage、totalPages、elementsOnPage、totalElements、contacts数组这几个字段 - 你定义的
Contacts类,实际对应的是JSON里contacts数组下单个元素的结构(包含id、version、type三个字段) - 你直接把整个顶层JSON字符串反序列化成
Contacts类,相当于让Newtonsoft.Json从JSON顶层找id、version、type这三个属性——但顶层根本没有这些字段,这些字段都嵌在两层结构之下,自然所有属性都只会保留类型默认值,不会被赋值。你调试时看到的“null”其实是值类型的默认状态:Guid默认是Guid.Empty、long默认是0、枚举默认是0,视觉上和未赋值没有区别。
适配你需求的解决方法
你不需要读取所有分页字段,完全没必要为了这几个不需要的字段新建一整套冗余的响应类,两种轻量方案可以选:
方案1:精准提取目标节点,跳过无关字段
借助Newtonsoft.Json内置的JObject解析能力,直接定位到contacts数组节点反序列化,全程不接触不需要的分页字段:
// 引入命名空间:using Newtonsoft.Json.Linq; var parsedJson = JObject.Parse(ContactsJson); // 直接取contacts数组的第一个元素,转成你已经定义好的Contacts类 Contacts contacts = parsedJson["contacts"].First!.ToObject<Contacts>();
方案2:定义极简中间类,自动忽略无关字段
如果不想手写JObject解析,可以定义一个只包含你需要的节点的中间响应类,Newtonsoft.Json默认会自动忽略类中没有定义的JSON字段:
// 中间类只保留需要的contacts数组节点,其余分页字段因为没有对应属性,不会参与映射 public class ContactPagedResult { public List<Contacts> contacts { get; set; } } // 反序列化代码 var result = JsonConvert.DeserializeObject<ContactPagedResult>(ContactsJson); Contacts contacts = result.contacts.First();
常见踩坑提醒
- 你原有
Contacts类的属性定义本身和JSON单个联系项的结构是完全匹配的:Guid类型对应字符串格式的id、long对应数字格式的version、枚举类型对应数字格式的type,Newtonsoft.Json原生支持这类自动类型转换,这部分不需要额外修改 - 不要尝试给
Contacts类加分页字段的属性来适配顶层JSON,那样完全不符合类的职责划分,还会引入多余的代码冗余
内容的提问来源于stack exchange,提问作者Pranav Bilurkar
相关产品推荐
相关产品推荐

