You need to enable JavaScript to run this app. 使用JsonConvert反序列化JSON到C# Contacts对象时属性值全为null的问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.06 11:24:05