新闻中心

C# 如何处理JSON中的循环引用 - JsonSerializerSettings配置

2025-12-05
浏览次数:
返回列表
System.Text.Json 默认不支持循环引用,会抛出异常以避免栈溢出和内存问题;推荐通过断开引用、[JsonIgnore] 特性或自定义 Converter 显式处理。

c# 如何处理json中的循环引用 - jsonserializersettings配置

在 C# 中使用 System.Text.Json(.NET Core 3.0+ 默认 JSON 库)时,它默认不支持循环引用检测与处理,也不会像旧版 Newtonsoft.Json 那样通过 JsonSerializerSettings.ReferenceLoopHandling 自动跳过或序列化引用。如果你遇到“A possible object cycle was detected”异常,说明你正在用 System.Text.Json 序列化含有循环引用的对象(比如父子双向导航属性),而它直接抛出异常来阻止不安全行为。

为什么 System.Text.Json 不允许循环引用?

这是出于安全与设计哲学的考虑:
– 避免无限递归导致栈溢出或内存耗尽
– 不引入隐式引用跟踪机制,保持轻量和可预测性
– 强制开发者显式建模数据结构,而非依赖运行时“兜底”

解决循环引用的实用方法

没有“全局设置开关”,但有几种清晰可控的方式:

  • 方式一:移除/断开循环引用(推荐)
    在序列化前,临时清空或置空引发循环的引用属性。例如:
// 假设有 Order → Customer → Orders 循环 order.Customer.Orders = null; // 断开反向引用 var json = JsonSerializer.Serialize(order);
  • 方式二:使用 [JsonIgnore] 特性标记
    在模型定义时,对不需要序列化的导航属性加特性:
public class Customer { public int Id { get; set; } public string Name { get; set; } [JsonIgnore] // 关键:跳过该属性 public List Orders { get; set; } }
  • 方式三:自定义 Converter 控制序列化逻辑
    适用于需要更精细控制(如只序列化 ID、或按需展开一层)的场景:
public class CustomerConverter : JsonConverter { public override Customer Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) => JsonSerializer.Deserialize(ref reader, options);
public override void Write(Utf8JsonWriter writer, Customer value, JsonSerializerOptions options)  
{  
    writer.WriteStartObject();  
    writer.WriteString("name", value.Name);  
    writer.WriteNumber("id", value.Id);  
    // 不写 Orders 属性,避免循环  
    writer.WriteEndObject();  
}  

}

// 使用时注册:
var options = new JsonSerializerOptions();
options.Converters.Add(new CustomerConverter());

注意:Newtonsoft.Json 仍支持 ReferenceLoopHandling

如果你必须用老方式(比如维护旧项目),可继续用 Newtonsoft.Json,并配置:

Moshi Chat Moshi Chat

法国AI实验室Kyutai推出的端到端实时多模态AI语音模型,具备听、说、看的能力,不仅可以实时收听,还能进行自然对话。

Moshi Chat 160 查看详情 Moshi Chat var settings = new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore, // 或 Serialize PreserveReferencesHandling = PreserveReferencesHandling.Objects }; string json = JsonConvert.SerializeObject(obj, settings);

但这会生成 $id/$ref 元数据,前端解析需额外处理,且增加 payload 大小。

基本上就这些。System.Text.Json 的设计取舍明确:不妥协安全性,也不隐藏复杂性。处理循环引用不是靠“开个开关”,而是靠你主动梳理对象关系——这反而让数据契约更清晰。

以上就是C# 如何处理JSON中的循环引用 - JsonSerializerSettings配置的详细内容,更多请关注其它相关文章!


# 自定义  # 如何推广淘客网站  # 涧西区产品推广营销公司  # 体培营销推广策略有哪些  # 兼职网站推广怎么样  # 平谷 网站建设  # 织金推广营销  # 江苏营销型网站建设费用  # 星云seo的优化  # 营销短信如何推广  # 江门优化型外贸网站建设  # 抛出  # 如何使用  # 不支持  # json  # 也不  # 如果你  # 数据结构  # 序列化  # 如何处理  # 递归  # 为什么  # .net  #   # 前端  # js  # c# 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 天眼查怎么看公司融资情况 天眼查企业融资历史查询步骤【攻略】  KFC套餐升级怎么获取优惠代码_KFC套餐升级活动与优惠代码获取方法  将HTML Canvas内容转换为可上传的图像文件(File对象)  必由学网页版入口 必由学官方平台直接访问  一加Ace 6T支持全新明眸护眼:通过了最严苛的护眼小金标认证  Pandas DataFrame 多条件优先级排序与排名  AO3网页版最新入口合集 Archive of Our Own在线访问指南  Python异步编程实践:使用Binance API构建实时交易数据流  AngularJS $http POST请求数据传递与Go后端接收实践  虚幻5科幻题材ARPG大作遭取消!本是《奇异人生》厂商新作  必由学在线入口 必由学网页版快速登录入口  Win11截图该按哪些键 Win11截屏完整流程解析【教程】  css滚动区域卡顿如何改善_css滚动问题用will-change优化渲染  探索高级语言到C/C++的转译路径:以Go为例及内存管理策略  狙击外星人小游戏开始_狙击外星人小游戏立即开始  Yandex官网搜索引擎免登录_俄罗斯Yandex一键直达入口  抖音商城签到领现金是真的吗_抖音商城签到奖励与提现说明  荒野行动PC版怎么注册_荒野行动PC版账号注册详细流程图文教程  QQ邮箱官网登录入口 QQ邮箱网页版邮箱快速登录  Selenium Python中处理点击后新窗口加载冻结问题的策略与实践  Pyrogram与g4f集成:异步编程实践与常见错误解决  HuggingFaceEmbeddings中向量嵌入维度调整的限制与理解  押井守高度称赞《辐射4》:玩了八年都停不下来!  win11如何加载ICC颜色配置文件 Win11校色文件安装与显示器色彩管理【指南】  解决 MongoDB 聚合查询中对象数组 _id 匹配问题  QQ邮箱登录平台入口 QQ邮箱网页版邮箱官方入口  漫蛙MANWA漫画主页官方入口 漫蛙漫画最新在线阅读地址  移动端XML文件怎么转换成Excel 手机和平板上的解决方案  怎样使用“本地安全策略”提升Windows安全性_Secpol.msc配置指南【高手】  拼多多购物车商品数量无法修改如何处理 拼多多购物车操作优化方法  优化MinIO list_objects_v2 操作的性能瓶颈与最佳实践  C#中解析不规范的HTML为XML 常见的坑与解决办法  Tabulator表格中精确实现日期时间排序的指南  Python中如何避免重复条件判断:利用数据结构实现动态逻辑  怎么去除衣服上的口红印_生活小妙招教你用酒精轻松擦除  Win11怎么查看显卡显存 Win11显示适配器属性及专用视频内存查询  Google翻译怎么语音输入_Google翻译语音输入功能使用与设置方法  解决Tabulator日期时间排序问题的专业指南  Python实时数据流中的动态最值查找策略  c++中的std::basic_string的SSO优化_c++短字符串优化深度解析  新三国志曹操传110级星符试炼夏侯渊极难攻略  J*aScript异步迭代器_j*ascript异步遍历  神经网络二分类模型训练异常:高损失与完美验证准确率的排查与修正  Django AJAX 文件上传教程:解决图片无法保存到模型的常见问题  4399体育竞技小游戏_4399小游戏赛事入口  小红书网页版入口链接分享 小红书官网直接进  React中useState与局部变量:理解组件状态管理与渲染机制  126邮箱网页版官方入口 126邮箱账号在线登录平台  Lar*el 递归关系中排除指定分支的教程  Highcharts 雷达图径向轴标签定制指南:利用多Y轴实现数值标注 

搜索