接口返回json对象出现套娃递归问题 | System.Text.Json 版本

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了接口返回json对象出现套娃递归问题 | System.Text.Json 版本相关的知识,希望对你有一定的参考价值。

前言

看到一篇文章《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“

以上是关于接口返回json对象出现套娃递归问题 | System.Text.Json 版本的主要内容,如果未能解决你的问题,请参考以下文章

java之递归

jdbc增删改查操作,封装工具类,实现泛型接口无限套娃

JavaList集合根据ParentId递归无限套娃

JavaList集合根据ParentId递归无限套娃

python小功能-递归解析Json

如何递归处理 JSON 数据并从函数返回处理后的 JSON?