接口返回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 版本相关推荐
- 使用.Net6中的System.Text.Json遇到几个常见问题及解决方案
前言 以前.NetCore是不内置JSON库的,所以大家都用Newtonsoft的JSON库,而且也确实挺好用的,不过既然官方出了标准库,那更方便更值得我们多用用,至少不用每次都nuget安装Newt ...
- [译]试用新的System.Text.Json API
译注 尝试新的System.Text.Json API 对于.NET Core 3.0,我们 提供了一个名为System.Text.Json的全新命名空间 ,支持读取器/写入器,文档对象模型(DOM) ...
- .NET Core 3.0 System.Text.Json 和 Newtonsoft.Json 行为不一致问题及解决办法
行为不一致 .NET Core 3.0 新出了个内置的 JSON 库, 全名叫做尼古拉斯 System.Text.Json - 性能更高占用内存更少这都不是事... 对我来说, 很多或大或小的项目能少 ...
- [js]javascript实现多个json对象及列表的美化,容错非法json
javascript实现多个json对象及列表的美化,容错非法json 本文介绍的使用javascript格式化json,核心的函数是eval和JSON.stringify. 支持多个json混在一起 ...
- 将$type添加到System.Text.Json序列化中,就像Newtonsoft那样用于动态对象属性
目录 介绍 用户故事5:在System.Text.Json JsonSerializer中支持动态类型 演示项目和测试 修改模型方法 包装方法 总结 Pro Coders团队最近将一个大型项目从New ...
- 关于: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,一直找不到原 ...
- Teams Bot 如何使用新的 System.Text.Json 库
我最近把 LuckyDraw的代码升级到了 .net core 3.1,当然我也很想使用最新的微软json库,System.Text.Json这个库的性能比之前Newtonsoft.Json速度更快, ...
- .NET 6 中的七个 System.Text.Json 特性
忽略循环引用 在 .NET 5 中,如果存在循环依赖, 那么序列化的时候会抛出异常, 而在 .NET 6 中, 你可以选择忽略它. Category dotnet = new() {Name = &q ...
- .NET 6新特性试用 | System.Text.Json序列化代码自动生成
前言 几乎所有.NET序列化程序的实现基础都是反射.下列代码是Newtonsoft.Json的实现: protected virtual JsonProperty CreateProperty(Mem ...
最新文章
- php判断网页编码,python判断网页编码的方法
- Amazon SNS和Amazon SQS有什么区别?
- linux线程下的读写锁
- Android 8.0 中如何读取内部和外部存储以及外置SDcard
- matlab华侨大学,闫铮-华侨大学-信息科学与工程学院
- 面试系列三 如何保证消息不被重复消费
- Android 之PackageManager框架
- java编程 内存_Java编程技术之浅析JVM内存
- 避坑指南!数据分析最容易被忽略的10个错误
- lbj学习日记 07 函数基础
- THE ORDER OF MASS
- FPGA SDRAM接口设计(一)初窥门径
- photoshop序列号问题
- 2023上海海洋大学计算机考研信息汇总
- linux下freerdp编译,linux下安装freerdp连接windows远程桌面的好软件软件
- 抽出她裤衩里的猴皮筋做个弹弓打你们家玻璃
- 输入nvidia-smi不能查看显卡NVIDIA型号的解决办法及快速查看电脑显卡NVIDIA型号信息
- NTKO Word在线编辑器
- Android架构 系统如何保证运行无误
- 最新cocoapods安装流程,安装过程中遇到的问题及解决方法