JSON反序列化后ControlInfoDataGroup的Items始终为null的问题排查
问题原因及修复方案
原因1:属性名与JSON键名不匹配(大小写/命名差异)
System.Text.Json 默认区分大小写。如果JSON中Home分组的子项键是"items"(小写),但你的ControlInfoDataGroup类里属性是Items(大写开头),反序列化时会因匹配失败导致Items为null。
修复方式:
- 方式一:用特性指定JSON键名映射
public class ControlInfoDataGroup { // 其他属性 [JsonPropertyName("items")] public List<ControlInfoDataItem> Items { get; set; } }
- 方式二:配置序列化选项忽略大小写
var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; var data = await JsonSerializer.DeserializeAsync<YourRootModel>(jsonStream, options);
原因2:属性类型与JSON结构不匹配
如果JSON中Home的子项是对象数组,但Items属性的类型和数组元素类型不匹配,或是涉及抽象类/接口未配置多态识别,都会导致反序列化失败,Items为null。
比如JSON结构是:
{ "Home": { "items": [{"type": "Movie", "name": "星际穿越"}] } }
若ControlInfoDataItem是抽象类,而实际元素是MovieItem派生类,默认不会自动识别派生类型。
修复方式:
- 确保
Items类型与JSON数组元素完全匹配:比如定义为List<ControlInfoDataItem>或ControlInfoDataItem[]。 - 涉及多态时,配置序列化选项识别派生类:
var options = new JsonSerializerOptions { TypeInfoResolver = new DefaultJsonTypeInfoResolver { Modifiers = { static typeInfo => { if (typeInfo.Type == typeof(ControlInfoDataItem)) { typeInfo.PolymorphismOptions = new JsonPolymorphismOptions { TypeDiscriminatorPropertyName = "type", DerivedTypes = { new JsonDerivedType(typeof(MovieItem), "Movie") } }; } } } } };
原因3:属性Setter不可访问
如果Items属性只有getter,或是setter为private/internal,System.Text.Json无法为其赋值,最终Items为null。
修复方式:
- 添加公共setter,建议同时初始化空集合避免null:
public class ControlInfoDataGroup { // 其他属性 public List<ControlInfoDataItem> Items { get; set; } = new List<ControlInfoDataItem>(); }
- 若需保持setter私有,可加特性允许序列化访问:
[JsonInclude] public List<ControlInfoDataItem> Items { get; private set; } = new List<ControlInfoDataItem>();
原因4:JSON键名与属性名完全不符
检查JSON中Home分组下的子项键名是否是你预期的名称——比如JSON里可能是"movieItems"而非"items"/"Items",这种完全不匹配的情况也会导致Items为null。
修复方式:
用[JsonPropertyName]特性映射到正确的JSON键名:
[JsonPropertyName("movieItems")] public List<ControlInfoDataItem> Items { get; set; }
内容的提问来源于stack exchange,提问作者Chibako
相关产品推荐
相关产品推荐

