停止Json循环序列化

15 浏览
0 Comments

停止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类是否是最终解决方案?

谢谢大家。

0
0 Comments

问题出现的原因是代码使用了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;
            });

该解决方法并不是很有效,但是当我将这个选项设置在序列化方法的参数中时,就不会出现异常了。

0