从API获取JSON反序列化为C#对象时返回Null,求排查思路
问题分析与解决思路
你的反序列化结果为null主要是JSON结构与C#类的属性映射不匹配导致的,具体问题和解决方法如下:
核心问题
根节点名称不匹配
JSON的根层级键是serviceSession(小驼峰、单数),但你的C#类ServiceSession中对应的属性是ServiceSessions(大驼峰、复数)。Json.NET默认会严格匹配属性名称和JSON键名,所以无法找到对应的映射,最终导致反序列化后整个对象为null。可选但建议:键名大小写一致性
JSON里的apn是小写,C#类里的属性是Apn(大驼峰)。虽然Json.NET在默认配置下能处理这种大小写差异,但显式指定映射会让代码更健壮,避免后续出现意外问题。
解决方法
方法一:修改C#类属性名称匹配JSON键
直接把类的属性名改成和JSON根键完全一致:
public class ServiceSession { // 属性名改为和JSON根键"serviceSession"一致 public Dictionary<string, List<ServiceSessionType>> ServiceSession { get; set; } } public class ServiceSessionType { public string Apn { get; set; } }
方法二:使用JsonProperty特性显式映射(推荐)
如果不想修改属性名称,可以用Newtonsoft.Json的JsonProperty特性,指定JSON中对应的键名,这样既保留C#的命名规范,又能正确映射JSON结构:
using Newtonsoft.Json; public class ServiceSession { [JsonProperty("serviceSession")] // 指定对应JSON的根键 public Dictionary<string, List<ServiceSessionType>> ServiceSessions { get; set; } } public class ServiceSessionType { [JsonProperty("apn")] // 显式映射JSON中的"apn"键 public string Apn { get; set; } }
额外注意:JSON格式规范性
你提供的JSON用了单引号,虽然Json.NET支持解析单引号的JSON,但标准JSON要求使用双引号,建议修正为标准格式,避免潜在的解析问题:
{"serviceSession":{ "123123123":[{"apn":"abc"},{"apn":"bcd"},{"apn":"def"}]}}
完成以上修改后,再执行var test = JsonConvert.DeserializeObject<ServiceSession>(json);就能得到正确的反序列化结果了。
内容的提问来源于stack exchange,提问作者Gian-Marco Schmid
相关产品推荐
相关产品推荐

