.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
相关产品推荐
相关产品推荐

