.NET Core Web API返回Ok(result)仅显示基础属性问题
接口代码如下:
public ActionResult LoginGet([FromBody]PostHelperEntity<Sw_User_LoginDto> helperEntity) { var result = _service.GetSingle(x => x.UserName == helperEntity.Entity.UserName && x.Password == helperEntity.Entity.Password); return Ok(result); }
result变量能正确获取包含name和surname字段的数据,但直接返回Ok(result)时,仅返回基础属性,结果如下:
{ "data": { "id": 1, "createDateTime": null, "updateDateTime": null }, "listData": null, "success": true, "message": null }
改用return Ok(JsonConvert.SerializeObject(result))时,Postman能收到包含name和surname的完整数据。
核心原因
ASP.NET Core默认使用System.Text.Json作为序列化器,而JsonConvert是Newtonsoft.Json的方法,两者的序列化规则、配置逻辑存在差异,导致默认序列化器未正确处理name和surname字段。
具体解决办法
统一使用Newtonsoft.Json作为默认序列化器
在项目配置中替换默认序列化器,让接口返回时自动用Newtonsoft.Json处理,和手动调用的逻辑保持一致:// .NET 6+ Program.cs 示例 builder.Services.AddControllers() .AddNewtonsoftJson(options => { // 可按需添加配置,比如忽略循环引用、自定义日期格式等 options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; });检查实体类的序列化特性
确认name和surname所在的实体类,是否被添加了[JsonIgnore](System.Text.Json特性)或[IgnoreDataMember]特性,导致默认序列化器忽略这些字段。如果有,直接移除;若需要针对不同序列化器做配置,可添加Newtonsoft.Json的[JsonProperty]特性强制字段被序列化。检查成员访问修饰符
确保name和surname的字段/属性是public修饰的。System.Text.Json默认仅序列化公共成员,若这两个成员是非公共的,默认序列化器会直接忽略,而Newtonsoft.Json在特定配置下可能会处理非公共成员(若无特殊配置,也仅处理公共成员,需排查此情况)。
内容的提问来源于stack exchange,提问作者batuhan aslantürk

