在System.Text.Json将ReferenceHandler设置为忽略的情况下序列化对象在.NET 7中无效

ezykj2lf  于 2023-03-04  发布在  .NET
关注(0)|答案(3)|浏览(179)

我试图在ASP.NET Core MVC Web API中将一个对象序列化为JSON,然后再将其返回给用户。该对象来自EF Core数据库,控制器是使用scaffolding生成的,其中包含了我添加的一些include属性,我希望将这些属性保留到我设置的自定义MaxDepth。我理解this was a feature added in System.Text.Json in .NET 6,并且我希望避免使用Newtonsoft.JSON。
在查阅了C#文档之后,我在Program.cs中添加了以下内容来配置ReferenceHandler:

builder.Services.AddControllers()
    .AddJsonOptions(o =>
    {
        o.JsonSerializerOptions.ReferenceHandler
            = ReferenceHandler.IgnoreCycles;
        o.JsonSerializerOptions.MaxDepth = 5;
    });

然而,在我的Program.cs中添加以下代码后,我在尝试访问端点时仍然收到错误:

System.Text.Json.JsonException: A possible object cycle was detected. This can either be due to a cycle or if the object depth is larger than the maximum allowed depth of 5. Consider using ReferenceHandler.Preserve on JsonSerializerOptions to support cycles.

将ReferenceHandler设置为“保留”也不起作用:

System.Text.Json.JsonException: The object or value could not be serialized. Path: $.Asset.AssetOdometers.
 ---> System.InvalidOperationException: CurrentDepth (5) is equal to or larger than the maximum allowed depth of 5. Cannot write the next JSON object or array.

我的GET端点如下所示:

// GET: api/Pmtasks
        [HttpGet]
        public async Task<ActionResult<IEnumerable<Pmtask>>> GetPmtasks()
        {
          if (_context.Pmtasks == null)
          {
              return NotFound();
          }
            return await _context.Pmtasks
                .Include(t => t.Asset)
                .Include(t => t.Task)
                .Include(t => t.PmscheduleType)
                .ToListAsync();
        }
w41d8nur

w41d8nur1#

您可以尝试删除JsonSerializerOptions.MaxDepth = 5;或在AssetTaskPmscheduleType属性上添加JsonIgnore属性以避免错误。如果您可以显示数据的详细信息并阐明所需内容,可能会有所帮助

yzuktlbb

yzuktlbb2#

看看第二个例外
System.Text.Json.JsonException:无法序列化对象或值。路径:$.资产.资产里程表. ---〉系统.无效操作异常:CurrentDepth(5)等于或大于允许的最大深度5。无法写入Next.jsON对象或数组。
我会尝试将MaxDepth设置为大于5或将其完全删除。

6pp0gazn

6pp0gazn3#

看起来您正在传递的对象的深度大于配置中允许的深度。请尝试增加允许的深度或仅删除o。JsonSerializerOptions。MaxDepth = 5;这将把它设置为其默认值64。

相关问题