为何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
相关产品推荐
相关产品推荐

