.NET 8 Web API返回List<User>为空对象列表的问题排查
.NET 8 Web API返回List为空对象列表的问题解决
问题现象
在.NET 8 Web API中使用IActionResult返回数据时:
返回匿名对象列表能正常输出完整数据:
public IActionResult GetData() { var erg1 = _database.table.Select(x => new { x.Id, x.firstname, x.lastname }); return Ok(erg1); }返回结果:
[ { "id": "732fdbd7-c878-45e8-8c43-5f795a697f6d", "firstname": "Uwe", "lastname": "Gabbert" }, { "id": "5288f9ea-25a2-4ffc-a711-7c0b2cf49c38", "firstname": "User", "lastname": "Test" } ]但返回自定义
User类的List<User>时,内存中对象数据正常,但接口返回空对象列表:public IActionResult GetData() { var erg2 = _database.table.Select(x => new User( x.Id, x.firstname, x.lastname )); return Ok(erg2); }返回结果:
[ {}, {} ]
User类定义:
public class User { public string Id = ""; public string Firstname = ""; public string Lastname = ""; public User(string id, string firstname, string lastname) { Id = id; Firstname = firstname; Lastname = lastname; } }
问题原因
.NET默认使用的System.Text.Json序列化器,默认只序列化类的属性(Properties),不序列化公共字段(Fields)。User类中定义的Id、Firstname、Lastname都是公共字段而非属性,因此序列化时这些字段会被忽略,最终返回空对象。
解决方案
方案1:将字段改为属性(推荐)
遵循.NET编码规范,把公共字段替换为只读属性(适合不需要修改的场景):
public class User { public string Id { get; } = ""; public string Firstname { get; } = ""; public string Lastname { get; } = ""; public User(string id, string firstname, string lastname) { Id = id; Firstname = firstname; Lastname = lastname; } }
如果需要后续修改属性值,可以将get;改为get; set;。
方案2:配置序列化器包含公共字段
如果不想修改类结构,可以在Program.cs中配置Json序列化选项,让序列化器处理公共字段:
builder.Services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.IncludeFields = true; });
验证效果
修改完成后,重新调用接口,即可正常返回包含User对象数据的JSON列表。
内容的提问来源于stack exchange,提问作者Uwe Gabbert
相关产品推荐
相关产品推荐

