C# WebAPI返回JSON格式异常无法被Angular读取的解决方案咨询
解决方案
你遇到的$id、$values字段是Newtonsoft.Json开启对象引用保留特性后生成的元字段,用于处理重复引用、循环引用场景下的序列化问题,当前配置的ReferenceLoopHandling.Serialize会触发该特性自动开启,可通过以下方式调整:
方案1:全局修改JSON序列化配置(推荐)
直接修改Global.asax中的格式化器规则,全局关闭引用保留特性:
// 忽略循环引用,避免序列化死循环 GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; // 关闭对象引用保留特性,不再生成$id、$values等元字段 GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.None; // 原有移除XML格式化器的配置保留 GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
方案2:单接口单独适配(不影响其他已有接口)
如果不想修改全局配置影响其他业务,可单独对当前接口做处理:
方式A:返回匿名类自动过滤元字段
修改接口代码,将EF实体映射为匿名类返回,天然不会携带序列化元字段:
[HttpGet] [Route("api/Events/GetEvents")] public IHttpActionResult GetEvents() { db.Configuration.ProxyCreationEnabled = false; var getevents = db.Events.Select(e => new { e.Event_id, e.Event_Name, e.Event_Date, Fixtures = e.Fixtures.ToList() }).ToList(); return Ok(getevents); }
方式B:给实体类加特性关闭引用追踪
给Event实体类加上JsonObject特性,显式关闭当前类的引用保留逻辑:
[JsonObject(IsReference = false)] public class Event { // 原有属性保持不变 public int Event_id { get; set; } public string Event_Name { get; set; } public DateTime Event_Date { get; set; } public List<Fixture> Fixtures { get; set; } }
内容的提问来源于stack exchange,提问作者Lesego Molako
相关产品推荐
相关产品推荐

