.net 5.0 webapi 返回json循环引用导致接口报错500解决方案
(我也是第一次遇到这个问题,所以记录一下)
问题描述:当我们需要返回嵌套资源,而嵌套资源就有可能导致循环依赖、循环引用的问题,就导致了Json序列化死循环,从而导致服务器返回500。这种情况出现的原因是 .net core 5.0 默认返回json的深度为32 超过32就会报错(32位个人理解 a中有一个b集合,b中有c集合,c中有d集合,一致嵌套至32层)
解决方案
1、使Dto减少json深度(推荐)
使用dto,将自己需要的数据通过automapper映射到dto中,返回dto就不会循环。之所以推荐就是因为我们所需的数据往往不会嵌套至32层,这是最合理的解决方案
2、在starup文件的ConfigureServices中进行如下配置
如果你所需的资源确实超过了32层,可以加深深度来解决,在这里还可以对返回的结果进行其它配置 ,具体见微软官方文档
services.AddControllers()
.AddJsonOptions(options =>
{
//json循环最大深度 如果你所需的资源确实超过了32层,可以加深深度来解决
options.JsonSerializerOptions.MaxDepth = 64;
//null值不序列化为json
options.JsonSerializerOptions.IgnoreNullValues = true;
});
3、忽略循环引用
1):安装 Microsoft.AspNetCore.MVC.Newtonsoft.Json
2):在starup文件的ConfigureServices中进行如下配置
services.AddControllersWithViews()
.AddNewtonsoftJson(options =>
{
//忽略循环引用
options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
});
分类:
C# .NET
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库