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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 00:15:03