停止Json循环序列化
停止Json循环序列化
当我想要将一个类属性列表序列化为Json时,我的应用程序停止并抛出以下异常(我使用的是.Net 6):
System.Text.Json.JsonException: 检测到可能的对象循环,该循环不受支持。这可能是由于循环或对象深度超过最大允许的深度32。位于...
我在不同的网站和来源中找到了许多相关主题,但是如他们建议的,我在program.cs中添加了以下选项:
builder.Services.AddControllers().AddNewtonsoftJson(options => { options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; });
上述代码没有起作用,然后我添加了下面的代码并一起使用:
builder.Services.AddControllers().AddNewtonsoftJson(options => { options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; }).AddJsonOptions(options => { options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles; });
但是这些选项也没有起作用。最后,我尝试将MaxDepth定义为1,但是仍然出现了这个错误。
我们如何阻止Json序列化器出现此错误,或者强制仅序列化接收到的数据的深度1并忽略导航属性?DTO类是否是最终解决方案?
谢谢大家。
问题出现的原因是代码使用了System.Text.Json作为序列化工具,而该工具在处理循环引用时会抛出异常。解决方法是通过配置序列化器来忽略循环引用。具体做法是在AddJsonOptions
方法中设置JsonSerializerOptions.ReferenceHandler
属性为ReferenceHandler.Preserve
,同时可以通过options.MaxDepth
属性限制序列化的深度。
修改后的代码如下:
services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.Preserve; // In addition, you can limit the depth // options.MaxDepth = 4; });
该解决方法并不是很有效,但是当我将这个选项设置在序列化方法的参数中时,就不会出现异常了。