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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 08:15:05