前言
看到一篇文章《Asp-Net-Core开发笔记:接口返回json对象出现套娃递归问题》
原文是使用 NewtonsoftJson
解决的返回json对象出现套娃递归问题:
services.AddControllersWithViews().AddNewtonsoftJson(options => {options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;});
其实,默认使用的 System.Text.Json
已经提供了相关属性解决这一问题。
重现问题
按照那篇文章的描述,我们创建 API, 重现错误:
[HttpGet]
public ActionResult<List<CrawlTask>> GetAll()
{//模拟数据var crawlTask = new CrawlTask { Name = "爬虫名称", UserId= "0f3d4b2f-3b4e-4d08-8f4c-0009a316f041" };var user = new User { Name = "用户名", CrawlTasks = new List<CrawlTask> { crawlTask } };crawlTask.User = user;return new List<CrawlTask> { crawlTask };
}
解决问题
.NET 5
同样,需要在服务配置里面添加代码:
services.AddControllers().AddJsonOptions(options =>options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.Preserve);
序列化时,它会将元数据属性添加到 JSON,看起来像这样:
因此,需要确保反序列化程序知道如何正确处理这些元数据属性:
var crawlTask = JsonSerializer.Deserialize<CrawlTask>(json, new JsonSerializerOptions
{ReferenceHandler = ReferenceHandler.Preserve
});
.NET 6
而在 .NET 6 中,新增了 IgnoreCycles
方式:
builder.Services.AddControllers().AddJsonOptions(options =>options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles);
序列化时,会导致套娃递归的属性直接变成null:
这和原文达到的效果一致。
结论
今天,我们使用 System.Text.Json
解决了套娃递归问题,但是前提是需要使用 .NET 6。
想了解更多内容,请关注我的个人公众号”My IO“