You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.Net Web API返回JSON含冗余数据且未格式化问题咨询

问题原因及解决方案

核心原因分析

  1. 错误的接口返回值:如果你的GET接口没有直接返回List<Company>数据,而是返回了控制器实例(比如return Ok(this))或包含框架内部对象的内容,就会把ControllerContext、Principal这些控制器的内部属性一并序列化出来。
  2. 冗余的序列化配置:你设置了PreserveReferencesHandling.Objects,这个配置会强制保留对象引用关系,生成额外的$id、$ref字段,若数据中存在隐性的循环引用(比如EF延迟加载的关联对象),会进一步带出更多冗余内容。
  3. 序列化器冲突:同时混用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.SystemJson NuGet包,再修改配置:
// 移除默认的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 11:47:23