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

前言

看到一篇文章《Asp-Net-Core开发笔记:接口返回json对象出现套娃递归问题》

842217030f730454af886f666280feee.png

原文是使用 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 };
}

22b7e6d9d94662d6fcd5989362d68d17.png

解决问题

.NET 5

同样,需要在服务配置里面添加代码:

services.AddControllers()
    .AddJsonOptions(options =>
        options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.Preserve);

序列化时,它会将元数据属性添加到 JSON,看起来像这样:

60db721f8ea6ffe71af4d066d2d92644.png

因此,需要确保反序列化程序知道如何正确处理这些元数据属性:

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:

631cc7c9d79573f6b4940f4b66985410.png

这和原文达到的效果一致。

结论

今天,我们使用 System.Text.Json 解决了套娃递归问题,但是前提是需要使用 .NET 6。

想了解更多内容,请关注我的个人公众号”My IO“

625dbca7cc8fb5ffa8ccf0a20b0b9adf.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值