ASP.NET Core Web API返回JSON时ListOfRequiredInputs字段缺失
问题根因
- ASP.NET Core 默认使用的
System.Text.Json序列化器默认仅序列化类的公有属性,不会处理公有字段。你定义的ListOfRequiredInputs是类的公有字段,不是属性,因此序列化阶段直接被忽略。 - 你的列表元素追加逻辑写法错误:
List<T>.Append()是 LINQ 扩展方法,不会修改原列表实例,只会返回追加元素后的新IEnumerable<T>序列,你调用后没有接收返回值,原列表始终是空的,就算配置了序列化字段也拿不到你添加的"Dom"元素。
修复步骤
- 将
ListOfRequiredInputs从公有字段改为公有自动属性,与CalObj的写法保持一致,直接在属性定义处初始化空列表即可。 - 将错误的
Append()调用替换为List<T>原生的Add()方法,直接修改原列表实例完成元素追加。
修正后的完整代码如下:
[Route("/Calculators/{id}")] [HttpGet("{id}")] public CalcRequiredInputs Get(int id) { using (var context = new PiContext()) { var calReqIn = new CalcRequiredInputs(); // 冗余的ToList()可以去掉,一次ToList()就已经拿到内存列表了 calReqIn.CalObj = context.TaskCalculators.Where(e => e.Id == id).ToList(); // 使用Add方法直接向原列表追加元素 calReqIn.ListOfRequiredInputs.Add("Dom"); return calReqIn; } } public class CalcRequiredInputs { // 改为公有属性,自动初始化空列表 public List<string> ListOfRequiredInputs { get; set; } = new List<string>(); public List<Calculator>? CalObj { get; set; } } public class Calculator { public int Id { get; set; } public string CalculatorName { get; set; } = null!; }
特殊场景配置(可选)
如果你因为特殊业务需求必须保留字段写法、不想改成属性,可以在Program.cs中配置JSON序列化规则,开启公有字段序列化支持:
builder.Services.AddControllers() .AddJsonOptions(options => { // 开启公有字段序列化 options.JsonSerializerOptions.IncludeFields = true; });
注意:就算开启了字段序列化配置,你原来的
Append()写法依然是错误的,必须替换为Add(),否则列表始终为空。
修复后接口返回的JSON结构会正常包含两个字段,示例如下:
{ "listOfRequiredInputs": ["Dom"], "calObj": [{"id":1,"calculatorName":"M2"}] }
内容的提问来源于stack exchange,提问作者Doctor J
相关产品推荐
相关产品推荐

