使用C# Newtonsoft Json.Net填充嵌套JSON对象时出现空值问题
解决Newtonsoft Json.Net填充嵌套JSON对象时的空值问题
你遇到的空值问题,核心原因基本是C#实体类的类型定义和JSON结构不匹配,尤其是subscriptions这种键为数字字符串的嵌套结构,最容易因为类型错误导致反序列化后为空。我给你整理一套完整的解决方案:
第一步:定义匹配JSON结构的实体类
根据你提供的JSON数据,对应的C#实体类应该这样写(重点注意subscriptions的类型):
public class UserResponse { [JsonProperty("ok")] public bool Ok { get; set; } [JsonProperty("user_id")] public int UserId { get; set; } [JsonProperty("name")] public string Name { get; set; } [JsonProperty("name_f")] public string NameF { get; set; } [JsonProperty("name_l")] public string NameL { get; set; } [JsonProperty("email")] public string Email { get; set; } [JsonProperty("login")] public string Login { get; set; } // 关键:subscriptions是键为字符串、值为日期的字典结构 [JsonProperty("subscriptions")] public Dictionary<string, DateTime> Subscriptions { get; set; } // 空数组用List<object>占位,后续有具体类型可以替换 [JsonProperty("categories")] public List<object> Categories { get; set; } [JsonProperty("groups")] public List<object> Groups { get; set; } [JsonProperty("resources")] public List<string> Resources { get; set; } }
第二步:执行反序列化
用Newtonsoft.Json的标准反序列化方法即可:
// 替换成你的JSON字符串 string jsonData = "{\"ok\":true,\"user_id\":1,\"name\":\"ceil bleu\",\"name_f\":\"ceil\",\"name_l\":\"bleu\",\"email\":\"xxxx@email.com\",\"login\":\"ceilbleu\",\"subscriptions\":{\"1\":\"2037-12-31\",\"4\":\"2037-12-31\",\"5\":\"2037-12-31\",\"6\":\"2037-12-31\"},\"categories\":[],\"groups\":[],\"resources\":[\"<a href=\\\"http:\\/\\/aa.com\\/member\\/signup\\\" class=\\\"am-resource-link\\\" id=\\\"resource-link-link-7\\\">Beli\\/Perpanjang Keanggotaan<\\/a>\"]}"; UserResponse userInfo = JsonConvert.DeserializeObject<UserResponse>(jsonData);
常见问题排查
如果还是出现空值,你可以检查这几个点:
subscriptions类型错误:如果你之前把它定义成普通类、List或者数组,肯定会反序列化失败变成null,必须用Dictionary<string, DateTime>来匹配键值对结构。- 缺失
[JsonProperty]属性:JSON里的键名(比如user_id)和类的属性名(UserId)不一致时,一定要加这个属性指定映射,否则Newtonsoft.Json找不到对应字段,会赋值为空。 - 日期格式不兼容:如果
subscriptions里的日期字符串格式和默认解析规则不匹配,可以自定义日期格式:
var jsonSettings = new JsonSerializerSettings { DateFormatString = "yyyy-MM-dd" }; UserResponse userInfo = JsonConvert.DeserializeObject<UserResponse>(jsonData, jsonSettings);
- 捕获异常定位问题:用try-catch包裹反序列化代码,查看具体错误信息,能快速找到问题根源:
try { UserResponse userInfo = JsonConvert.DeserializeObject<UserResponse>(jsonData); } catch (JsonException ex) { // 打印异常信息,比如格式错误、类型不匹配等 Console.WriteLine($"反序列化失败:{ex.Message}"); }
内容的提问来源于stack exchange,提问作者Herahadi An
相关产品推荐
相关产品推荐

