Asp-Net-Core开发笔记:接口返回json对象出现套娃递归问题

前言

看了下推送记录,一个月前,OK,我又变成月更了o(╯□╰)o,这绝对不行![○・`Д´・ ○]

所以今天来更新了

其实不是我懒得更新或者是太忙,其实是最近在写一篇很长的博客,一直没写完( Ĭ ^ Ĭ )

另外快过年了,我领到了公众号作者的红包封面定制机会,接下来找时间设计(copy)一个好看的红包封面作为粉丝福利发给各位读者大大511e8804fdbd55a279d0353f9b74df39.png

好吧,先进入正题……

有一个关于WebApi序列化的问题,跟设计有关,但在涉及到关联字段的时候经常会遇到。

实体类

先看看实体类定义,限于篇幅,只保留几个关键字段。

public class CrawlTask : EntityBase {/// <summary>/// 爬虫名称/// </summary>public string Name { get; set; }/// <summary>/// 创建这个爬虫的用户/// </summary>public User User { get; set; }/// <summary>/// 用户ID/// </summary>public string? UserId { get; set; }
}

用户实体类:

public class User : EntityBase {/// <summary>/// 用户名/// </summary>public string Name { get; set; }/// <summary>/// 用户创建的爬虫/// </summary>public List<CrawlTask> CrawlTasks { get; set; }
}

接口

然后接口这样写:

/// <summary>
/// 获取用户创建的全部爬虫
/// </summary>
/// <returns></returns>
[HttpGet]
public ActionResult<List<CrawlTask>> GetAll() {var user = _authService.GetUser(User.Identity?.Name);return user.CrawlTasks;
}

然后请求这个接口,我们期望的数据是:

[{"name": "爬虫名称","user": {"name": "用户名"},"userId": "0f3d4b2f-3b4e-4d08-8f4c-0009a316f041","id": "4d52d83b-f3ec-47c6-ab26-e241c09c14d1"}
]

报错

但事实是直接报错:

System.Text.Json.JsonException: A possible object cycle was detected. This can either be due to a cycle or if the object depth is larger than the maximum allowed depth of 32. Consider using ReferenceHandler.Preserve on JsonSerializerOptions to support cycles.
Path: $.User.CrawlTasks.User.CrawlTasks.User.CrawlTasks.User.CrawlTasks.User.CrawlTasks.User.CrawlTasks.User.CrawlTasks.User.CrawlTasks.User.CrawlTasks.User.CrawlTasks.Name.

很明显,返回的对象套娃递归了。

注意那个Path:$.User.CrawlTasks.User.CrawlTasks.User.Crawl...,我们上面期望的json数据是:

{"name": "test crawl123","user": {"name": "string"},"userId": "0f3d4b2f-3b4e-4d08-8f4c-0009a316f041","id": "4d52d83b-f3ec-47c6-ab26-e241c09c14d1"
}

Crawl对象下的User只有Name属性,不要把CrawlTasks列表也显示出来,但程序它不知道啊,User里有CrawlTasks,然后CrawlTasks里面又有User,这就陷入一个套娃递归了……

初步解决

很明显,这根设计和数据获取方式有问题,可以通过换个查询方式来避免,比如:

[HttpGet]
public ActionResult<List<CrawlTask>> GetAll() {return _crawlRepo.Where(a => a.UserId == User.Identity.Name).ToList();
}

因为这里没有请求Crawl的导航属性User,所以不会读取User对象的信息,出现的结果是这样:

[{"name": "test crawl123","user": null,"userId": "0f3d4b2f-3b4e-4d08-8f4c-0009a316f041","id": "4d52d83b-f3ec-47c6-ab26-e241c09c14d1"}
]

可以看到User对象的值是null,对于接口来说已经够用了,毕竟这是获取当前用户的所有爬虫,所有爬虫的user属性都是同一个,没必要重复啦。

不过即使把User对象加上也是完全没问题的,这里改一下接口看一下效果:

[HttpGet]
public ActionResult<List<CrawlTask>> GetAll() {return _crawlRepo.Select.Where(a => a.UserId == User.Identity.Name).Include(a => a.User)  // 添加了这行代码,请求关联对象.ToList();
}

返回的结果:

[{"name": "test crawl123","user": {"name": "string","crawlTasks": null,"id": "0f3d4b2f-3b4e-4d08-8f4c-0009a316f041"},"userId": "0f3d4b2f-3b4e-4d08-8f4c-0009a316f041","id": "4d52d83b-f3ec-47c6-ab26-e241c09c14d1"}
]

可以看到,返回的Crawl对象中,User对象里的crawlTasks属性是空的,因为我们前面加的那行代码:.Include(a => a.User),FreeSQL还支持进一步查询User的导航属性crawlTasks,但需要置顶Includethen参数,配置套娃查询……

继续!

那有没有什么办法是不改动接口代码的情况下,解决接口套娃的问题?

答案肯定有啦

这就要用NewtonsoftJson了~

首先安装Microsoft.AspNetCore.Mvc.NewtonsoftJson这个nuget包

然后在服务配置里面添加代码

services.AddControllersWithViews().AddNewtonsoftJson(options => {options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;});

然后再请求接口,返回的结果就跟上面的一样啦~

会导致套娃递归的属性直接变成null~

PS:这个代码的作用就是把WebApi默认的json序列化器从System.Text.Json改成NewtonsoftJson,并且配置处理套娃递归的方式为忽略~

参考文档

  • https://stackoverflow.com/questions/59199593/net-core-3-0-possible-object-cycle-was-detected-which-is-not-supported

5e98305cfeb0fd59ef299c1c4deac197.png

代码使我头疼之React初学习


aa9dee731325238ee5962f88a29c7327.png

AspNetCore在docker部署时遇到一个小坑


449ff204d231e951659db888c101f958.png

Asp.Net Core部署:早知道,还是docker!以及一点碎碎念


e08f4f242839d0a8e358c5c59a1bd305.png

纯前端实现词云展示+附微博热搜词云Demo代码


8c5f012e67c333751294cff087b6bf2d.png

一个玄学的爬虫bug竟让我放弃Python语言!?背后的原因令人唏嘘~


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/291837.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring之二——使用maven创建一个java project

2019独角兽企业重金招聘Python工程师标准>>> maven的安装及Eclipse maven插件安装这里不再说了&#xff0c;安装可以看这篇博客&#xff1a; http://www.blogjava.net/fancydeepin/archive/2012/07/13/eclipse_maven3_plugin.html 需要注意的是&#xff0c;maven在w…

自从装了windows神器,再也不用羡慕mac了

1. 命令行神器 1.1 GOW Gow&#xff08;Gnu On Windows&#xff09;是Cygwin的轻量级替代品。 它使用一个方便的NSIS安装程序&#xff0c;安装超过100个非常有用的开源UNIX应用程序&#xff0c;编译为本机win32二进制文件。 它被设计为尽可能小&#xff0c;大约18 MB&#xff…

第1章 绪论

《数据结构》学习笔记 第1章 绪论 1.1 数据结构的研究内容 计算机计算数值时&#xff0c;一般经过一下步骤&#xff1a; 1.从具体问题抽象出数学模型&#xff08;实质是分析问题&#xff09;。 2.设计一个解次数学模型的算法。 3.编写程序&#xff0c;进行测试、调试&#xf…

C#中泛型约束的具体用法

前言上一篇博文简单介绍了泛型的约束&#xff0c;说是通过where<>来实现具体委托占位符的约束。那么约束又有什么类型和次序呢。这篇文章咱们一起看看。目前共5种类型的约束。类名&#xff1a;只有这个类型的类或从它继承的类才能用作类型实参class&#xff1a;任何引用类…

系统架构:Web应用架构的新趋势 前后端分离的想法

最近研究servlet&#xff0c;看书时候书里讲到了c/s架构到b/s架构的演变&#xff0c;讲servlet的书都很老了&#xff0c;现在的b/s架构已经不是几年前的b/s架构&#xff0c;其实b/s架构就是web应用开发&#xff0c;对于这样的架构我们现在应该考虑的是前端和后端的分离&#xf…

Asp-Net-Core学习笔记:身份认证入门

前言过年前我又来更新了~我就说了最近不是在偷懒吧&#xff0c;其实这段时间还是有积累一些东西的&#xff0c;不过还没去整理……所以只能发以前没写完的一些笔记出来就当做是温习一下啦PS&#xff1a;之前说的红包封面我还没搞&#xff0c;得抓紧时间了最近在准备搞一个我之前…

第1章 大数据挖掘及应用概论

《大数据挖掘及应用》学习笔记。 第1章 大数据挖掘及应用概论 数据挖掘是数据分析的提升。 1.1 大数据智能分析处理的普及和应用 1.1.1 云计算(cloud computing) 云计算是一种按使用量付费的模式&#xff0c;这种模式提供可用的、便捷的、按需的网络访问&#xff0c;进入可配…

浮点型数据的输出格式

2019独角兽企业重金招聘Python工程师标准>>> float的占位符为f%,默认输出六位小数&#xff0c;如果要限制位数的输出&#xff0c;可以用%.2f这样的格式&#xff0c;double同上。 如果是浮点型转换成整型不会进行四舍五入&#xff0c;浮点型的输出如果截取了位数进行…

linux网络编程之用socket实现简单客户端和服务端的通信(基于TCP)

一、介绍基于TCP协议通过socket实现网络编程常用API 1、读者如果不是很熟悉,可以先看我之前写的几篇博客,有socket,地址结构的理解,更加方便读者理解 地址分别是: 1)、http://blog.csdn.net/u011068702/article/details/56479927 2)、http://blog.csdn.net/u01106870…

VS2010下Boost1.55.0配置

为什么80%的码农都做不了架构师&#xff1f;>>> 打开程序菜单&#xff0c;选择Visual Studio Tools里面的 Visual Studio 命令提示。转到解压后的Boost所在目录&#xff0c;输入Bootstrap&#xff0c;执行完毕会生成b2.exe。输入&#xff08;目录下的bjam.exe和b2.…

Linux信号实践(3) --信号内核表示

信号在内核中的表示执行信号的处理动作称为信号递达&#xff08;Delivery&#xff09;&#xff0c;信号从产生到递达之间的状态&#xff0c;称为信号未决&#xff08;Pending&#xff09;。进程可以选择阻塞&#xff08;Block&#xff09;某个信号。被阻塞的信号产生时将保持在…

第2章 数据认知与预处理

《大数据挖掘及应用》学习笔记。 第2章 数据认知与预处理 2.1 数据分析的定义和流程 数据分析(data analysis)是指用适当的统计分析方法对收集来的大量数据进行分析和解释&#xff0c;提取出有用的信息形成结论&#xff0c;从而对数据加以详细研究和概括总结的过程。 2.1.1 如…

9 C++ Boost 多线程,线程同步

线程的创建 boost_thread,boost_system 多线程的创建 线程的参数传递 线程的创建方式 线程的join 加入join,回收线程线程中断 线程中断2, 线程组 boost 线程的死锁 boost 线程递归锁 线程互斥锁,线程同步 unique_lock 锁,离开作用域自动释放 unique_lock 锁 示例 2,可以显式的释…

命令注入_命令注入绕过方式总结

前言命令注入是web中常见的漏洞之一&#xff0c;由于web应用程序未对用户提交的数据做严格的过滤&#xff0c;导致用户输入可以直接被linux或windows系统当成命令执行&#xff0c;一般都会造成严重的危害。常用符号分号(;)多条语句顺序执行时的分割符号。1cmd1;cmd2管道符(|)cm…

集合的结构示意图

转载于:https://blog.51cto.com/8467007/1364724

第1章 数据分析概述

《Python数据分析基础教程》学习笔记。 第1章 数据分析概述 1.1 数据的性质 1.1.1 数据的概念 所谓数据就是描述事物的符号&#xff0c;是对客观事物的性质、状态和相互关系等进行记载的物理符号或者是这些物理符号的组合。 在计算机系统中&#xff0c;各种文字、字母、数字符…

Android之通过adb shell getprop、netstat命令看dns、ip

1、查看dns 1)、输入adb shell 2 )、输入getprop ,查看配置 3)、getprop | grep dns 过滤dns 4) 、getprop | grep dns 输出dns 5) 、修改dns 需要root ,然后输入 adb shell 然后输

Cache占用过多内存导致Linux系统内存不足问题排查

问题描述Linux服务器内存使用量超过阈值&#xff0c;触发报警。问题排查首先&#xff0c;通过free命令观察系统的内存使用情况&#xff0c;显示如下&#xff1a;total used free shared buffers cached Mem: 24675796 24587144 88652 …

linux之ip route命令

1.基础知识 1.1 路由 &#xff08;Routing&#xff09; 1.1.1 路由策略 &#xff08;使用 ip rule 命令操作路由策略数据库&#xff09; 基于策略的路由比传统路由在功能上更强大&#xff0c;使用更灵活&#xff0c;它使网络管理员不仅能够根据目的地址而且能够根据报文大小、应…

违反Apache 2.0许可证再分发被指控,火山引擎回应

文 | 白开水不加糖出品 | OSC开源社区&#xff08;ID&#xff1a;oschina2013&#xff09;针对有关违反 Apache 2.0 许可证&#xff0c;重新发行 SkyWalking 的指控&#xff0c;火山引擎方面作出回应称&#xff1a;火山引擎相关负责人表示&#xff0c;火山引擎接到社区反馈后&a…