我试图在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();
}
3条答案
按热度按时间w41d8nur1#
您可以尝试删除
JsonSerializerOptions.MaxDepth = 5
;或在Asset
、Task
、PmscheduleType
属性上添加JsonIgnore
属性以避免错误。如果您可以显示数据的详细信息并阐明所需内容,可能会有所帮助yzuktlbb2#
看看第二个例外
System.Text.Json.JsonException:无法序列化对象或值。路径:$.资产.资产里程表. ---〉系统.无效操作异常:CurrentDepth(5)等于或大于允许的最大深度5。无法写入Next.jsON对象或数组。
我会尝试将MaxDepth设置为大于5或将其完全删除。
6pp0gazn3#
看起来您正在传递的对象的深度大于配置中允许的深度。请尝试增加允许的深度或仅删除o。JsonSerializerOptions。MaxDepth = 5;这将把它设置为其默认值64。