前言

看到一篇文章《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 版本相关推荐

  1. 使用.Net6中的System.Text.Json遇到几个常见问题及解决方案

    前言 以前.NetCore是不内置JSON库的,所以大家都用Newtonsoft的JSON库,而且也确实挺好用的,不过既然官方出了标准库,那更方便更值得我们多用用,至少不用每次都nuget安装Newt ...

  2. [译]试用新的System.Text.Json API

    译注 尝试新的System.Text.Json API 对于.NET Core 3.0,我们 提供了一个名为System.Text.Json的全新命名空间 ,支持读取器/写入器,文档对象模型(DOM) ...

  3. .NET Core 3.0 System.Text.Json 和 Newtonsoft.Json 行为不一致问题及解决办法

    行为不一致 .NET Core 3.0 新出了个内置的 JSON 库, 全名叫做尼古拉斯 System.Text.Json - 性能更高占用内存更少这都不是事... 对我来说, 很多或大或小的项目能少 ...

  4. [js]javascript实现多个json对象及列表的美化,容错非法json

    javascript实现多个json对象及列表的美化,容错非法json 本文介绍的使用javascript格式化json,核心的函数是eval和JSON.stringify. 支持多个json混在一起 ...

  5. 将$type添加到System.Text.Json序列化中,就像Newtonsoft那样用于动态对象属性

    目录 介绍 用户故事5:在System.Text.Json JsonSerializer中支持动态类型 演示项目和测试 修改模型方法 包装方法 总结 Pro Coders团队最近将一个大型项目从New ...

  6. 关于:js使用$.parseJSON字符串转json对象报错Uncaught SyntaxError- Unexpected token o in JSON at position 1

    今天使用js使用$.parseJSON字符串转json对象报错Uncaught SyntaxError- Unexpected token o in JSON at position 1,一直找不到原 ...

  7. Teams Bot 如何使用新的 System.Text.Json 库

    我最近把 LuckyDraw的代码升级到了 .net core 3.1,当然我也很想使用最新的微软json库,System.Text.Json这个库的性能比之前Newtonsoft.Json速度更快, ...

  8. .NET 6 中的七个 System.Text.Json 特性

    忽略循环引用 在 .NET 5 中,如果存在循环依赖, 那么序列化的时候会抛出异常, 而在 .NET 6 中, 你可以选择忽略它. Category dotnet = new() {Name = &q ...

  9. .NET 6新特性试用 | System.Text.Json序列化代码自动生成

    前言 几乎所有.NET序列化程序的实现基础都是反射.下列代码是Newtonsoft.Json的实现: protected virtual JsonProperty CreateProperty(Mem ...

最新文章

  1. php判断网页编码,python判断网页编码的方法
  2. Amazon SNS和Amazon SQS有什么区别?
  3. linux线程下的读写锁
  4. Android 8.0 中如何读取内部和外部存储以及外置SDcard
  5. matlab华侨大学,闫铮-华侨大学-信息科学与工程学院
  6. 面试系列三 如何保证消息不被重复消费
  7. Android 之PackageManager框架
  8. java编程 内存_Java编程技术之浅析JVM内存
  9. 避坑指南!数据分析最容易被忽略的10个错误
  10. lbj学习日记 07 函数基础
  11. THE ORDER OF MASS
  12. FPGA SDRAM接口设计(一)初窥门径
  13. photoshop序列号问题
  14. 2023上海海洋大学计算机考研信息汇总
  15. linux下freerdp编译,linux下安装freerdp连接windows远程桌面的好软件软件
  16. 抽出她裤衩里的猴皮筋做个弹弓打你们家玻璃
  17. 输入nvidia-smi不能查看显卡NVIDIA型号的解决办法及快速查看电脑显卡NVIDIA型号信息
  18. NTKO Word在线编辑器
  19. Android架构 系统如何保证运行无误
  20. 最新cocoapods安装流程,安装过程中遇到的问题及解决方法

热门文章

  1. Swiper(Swiper master)是目前应用较广泛的移动端网页触摸内容滑动js插件
  2. paper 17 : 机器学习算法思想简单梳理
  3. bzoj 3232 01分数规划+最大权封闭子图判定
  4. map reduce相关程序
  5. PHP实现微信随机红包算法和微信红包的架构设计简介
  6. 关于vue执行打包后,如何在本地浏览问题
  7. 设计模式之-命令模式(Command Pattern)
  8. extjs 前端js代码调用后台函数方法
  9. SQL Server 负载均衡集群(转)
  10. 如何在不支付Adobe Photoshop费用的情况下处理Camera Raw