ASP.NET Core 6中ReadFromJsonAsync<T>反序列化嵌套类数据丢失
问题描述
在ASP.NET Core 6中调用response.Content.ReadFromJsonAsync<T>()方法时,响应对象无法正确反序列化。原本包含20个Column对象的AvailableColumns实例,执行该方法后Columns集合变为空。
相关实体类定义
public class AvailableColumns { public List<Column> Columns { get; } = new List<Column>(); } public class Column { public string Name { get; set; } public List<Value> Values { get; set; } = new List<Value>(); } public class Value { public string InternalValue { get; set; } public string DisplayName { get; set; } }
执行代码
// 执行前对象T包含20个columns response.Data = await response.Content.ReadFromJsonAsync<T>(); // 执行后response.Data的columns数量为0
解决方案
问题核心是AvailableColumns类的Columns属性仅有getter,无setter。ASP.NET Core 6默认使用的System.Text.Json序列化器,需要属性具备可访问的setter才能完成反序列化赋值,否则无法将JSON中的数据填充到集合中。
可通过以下方式解决:
- 给
Columns属性添加公共setter:public class AvailableColumns { public List<Column> Columns { get; set; } = new List<Column>(); } - 若不想对外暴露setter,可添加私有setter,序列化器仍能正常访问:
public class AvailableColumns { public List<Column> Columns { get; private set; } = new List<Column>(); }
额外检查项:确认返回的JSON结构与实体类匹配,System.Text.Json默认区分大小写。如果JSON中的键是小写的"columns",需通过特性映射:
using System.Text.Json.Serialization; public class AvailableColumns { [JsonPropertyName("columns")] public List<Column> Columns { get; set; } = new List<Column>(); }
内容的提问来源于stack exchange,提问作者HelloWorld
相关产品推荐
相关产品推荐

