You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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\":[\"&lt;a href=\\\"http:\\/\\/aa.com\\/member\\/signup\\\" class=\\\"am-resource-link\\\" id=\\\"resource-link-link-7\\\"&gt;Beli\\/Perpanjang Keanggotaan&lt;\\/a&gt;\"]}";

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:05:02