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

.NET Core 6中Json循环引用异常的解决方法求助

JsonException: 检测到可能的对象循环。这可能是由于循环引用,或者对象深度超过了允许的最大深度64。请考虑在JsonSerializerOptions上使用ReferenceHandler.Preserve来支持循环引用。路径: $.Sliders.Company.Sliders.Company.Sliders.Company.Sliders.Company.Sliders.Company.Sliders.Company.Sliders.Company

响应中出现上述报错,原因是对象间存在相互引用。尝试过以下配置但均无效:

  • System.Text.Json 保留引用配置:
builder.Services.AddControllers().AddJsonOptions(x =>
            x.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.Preserve);
  • System.Text.Json 忽略循环配置:
builder.Services.AddControllers().AddJsonOptions(x =>
           x.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles);
  • 配置Http.Json.JsonOptions:
builder.Services.Configure<Microsoft.AspNetCore.Http.Json.JsonOptions>
(options => options.SerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles);
  • Newtonsoft.Json 忽略循环配置:
builder.Services.AddControllers().AddNewtonsoftJson(x =>
x.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore);

解决方法

1. 确认配置生效范围

如果是API控制器返回对象,确保配置的是AddControllers()对应的Json选项(Http.Json.JsonOptions主要用于最小API场景)。同时检查控制器Action中是否单独设置了JsonSerializerOptions,这会覆盖全局配置。

2. 同时调整最大深度限制

报错提及可能存在深度超限问题,可在配置中同时增大序列化最大深度:

builder.Services.AddControllers().AddJsonOptions(x =>
{
    x.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles;
    x.JsonSerializerOptions.MaxDepth = 128; // 根据实际业务调整数值
});

3. 用DTO彻底规避循环引用

定义数据传输对象(DTO),只返回前端需要的字段,剔除循环引用的导航属性:

// 原始实体类
public class Slider
{
    public int Id { get; set; }
    public string Name { get; set; }
    public Company Company { get; set; }
}

public class Company
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Slider> Sliders { get; set; }
}

// DTO类
public class SliderDto
{
    public int Id { get; set; }
    public string Name { get; set; }
    public CompanyDto Company { get; set; }
}

public class CompanyDto
{
    public int Id { get; set; }
    public string Name { get; set; }
    // 移除Sliders属性,切断循环链
}

控制器中返回DTO对象而非原始实体。

4. 优化EF Core数据加载逻辑

若使用EF Core,循环引用可能来自Include加载关联实体:

  • 禁用全局延迟加载:
builder.Services.AddDbContext<YourDbContext>(options =>
    options.UseSqlServer("your_connection_string")
           .UseLazyLoadingProxies(false));
  • 查询时直接投影到DTO:
var sliders = await _dbContext.Sliders
    .Select(s => new SliderDto
    {
        Id = s.Id,
        Name = s.Name,
        Company = new CompanyDto
        {
            Id = s.Company.Id,
            Name = s.Company.Name
        }
    })
    .ToListAsync();

5. 确保Newtonsoft.Json配置完整

使用Newtonsoft.Json时,必须先安装Microsoft.AspNetCore.Mvc.NewtonsoftJson NuGet包,再配置:

builder.Services.AddControllers()
    .AddNewtonsoftJson(options =>
    {
        options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
    });

内容的提问来源于stack exchange,提问作者soheila

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 15:22:51