ASP.Net Web API返回JSON含冗余数据且未格式化问题咨询
问题原因及解决方案
核心原因分析
- 错误的接口返回值:如果你的GET接口没有直接返回
List<Company>数据,而是返回了控制器实例(比如return Ok(this))或包含框架内部对象的内容,就会把ControllerContext、Principal这些控制器的内部属性一并序列化出来。 - 冗余的序列化配置:你设置了
PreserveReferencesHandling.Objects,这个配置会强制保留对象引用关系,生成额外的$id、$ref字段,若数据中存在隐性的循环引用(比如EF延迟加载的关联对象),会进一步带出更多冗余内容。 - 序列化器冲突:同时混用Newtonsoft.Json和System.Text.Json会导致配置混乱,框架无法正确使用指定的序列化器处理实体类,引发异常序列化行为。
解决方案
1. 修正接口返回逻辑
确保接口直接返回目标数据列表,正确包装为OkResult:
public IHttpActionResult GetCompanies() { List<Company> companies = // 你的数据获取逻辑,比如从数据库查询 return Ok(companies); }
禁止返回控制器实例、错误构造的HttpResponseMessage等包含框架内部对象的内容。
2. 调整序列化配置
删除不必要的引用保留设置,同时开启JSON格式化显示:
修改WebApiConfig.cs的Register方法:
var jsonFormatter = config.Formatters.JsonFormatter; // 关闭引用保留,避免额外冗余字段 jsonFormatter.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.None; // 开启格式化,方便调试查看 jsonFormatter.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented; config.Formatters.Remove(config.Formatters.XmlFormatter);
3. 统一序列化器(二选一)
- 使用Newtonsoft.Json(默认):保持上述配置即可,无需额外操作。
- 切换到System.Text.Json:先安装
Microsoft.AspNet.WebApi.SystemJsonNuGet包,再修改配置:
// 移除默认的Newtonsoft.Json格式化器 config.Formatters.Remove(config.Formatters.JsonFormatter); // 添加System.Text.Json格式化器 config.Formatters.Add(new SystemJsonMediaTypeFormatter()); // 开启格式化显示 config.Formatters.JsonFormatter.SerializerOptions.WriteIndented = true;
注意不要同时启用两种序列化器,避免配置冲突。
额外检查
- 确认Company类没有意外引用Controller、HttpContext等框架对象属性。
- 若使用Entity Framework,关闭延迟加载(或使用DTO仅返回需要的字段),防止关联实体被意外序列化。
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

