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

为何C#中反序列化指定JSON时返回null?

问题原因及解决方案

核心原因

你使用的System.Text.Json默认仅处理带get/set的公共属性,但你的CountriesData和CountryData类中定义的都是无get/set的公共字段,导致反序列化时无法匹配JSON数据,最终返回null。

至于CS8601警告,是因为启用可空引用类型检查后,List<CountryData>类型的字段存在被赋值为null的可能,编译器以此提醒空引用风险。

两种解决办法

方法1:将字段改为属性(推荐)

把类中的字段替换为带get/set的属性,这是C#规范写法,也符合System.Text.Json的默认处理逻辑:

[Serializable]
public class CountriesData
{
    public List<CountryData> countries { get; set; }
}

[Serializable]
public class CountryData
{
    public string name { get; set; }
    public List<string> alternative_names { get; set; }
    public string formal_name { get; set; }
    public bool the_prefix { get; set; }
    public bool in_un { get; set; }
}

如果后续需要调整命名风格(比如C#用驼峰、JSON用蛇形),可通过JsonPropertyName特性指定映射关系,示例:

[JsonPropertyName("formal_name")]
public string FormalName { get; set; }

方法2:配置反序列化选项以支持字段

若不想修改类结构,可在反序列化时传入JsonSerializerOptions,开启字段解析配置:

var options = new JsonSerializerOptions
{
    IncludeFields = true,
    // 若JSON与类的命名大小写/风格不一致,可开启自动匹配
    // PropertyNameCaseInsensitive = true
};

CountriesData data = JsonSerializer.Deserialize<CountriesData>(jsonString, options);

消除CS8601警告的可选方案

  • 给可空成员添加?标记,比如public List<CountryData>? countries;
  • 对反序列化后的结果做判空处理
  • 项目文件中关闭可空引用类型检查(不推荐)

内容的提问来源于stack exchange,提问作者Robin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 04:22:58