无需登录 数据私有 本地保存

JSON 循环引用检测器 - 发现对象环状依赖

5
0
0
0

JSON 循环引用检测器

检测对象环状依赖,支持标准JSON及 $ref 扩展格式,快速定位循环引用路径

预设示例: 🔄 简单循环 ↩️ 自引用 🕸️ 深层循环 🔀 多重循环 ✅ 无循环JSON 🏗️ 复杂嵌套
使用 {"$ref": "#/路径"} 标记引用关系,模拟对象间的循环依赖
检测结果
对象结构树

输入JSON并点击检测,结果将显示在这里

常见问题

循环引用(Circular Reference)指对象A引用了对象B,而对象B又直接或间接引用了对象A,形成闭环。例如:

  • 直接循环:对象包含指向自身的属性
  • 间接循环:A → B → C → A 这样的引用链

标准JSON格式不支持循环引用,JSON.stringify()遇到循环引用会抛出错误:"Converting circular structure to JSON"

JSON.stringify()在序列化对象时采用深度优先遍历。当它遇到已经访问过的对象引用时,会陷入无限递归。V8引擎等实现会主动检测这种情况并抛出TypeError

常见场景:

  • DOM节点序列化(DOM树天然包含父子双向引用)
  • 双向关联的数据模型(如用户↔订单)
  • 链表、树等数据结构中错误地保留了反向指针

$ref是JSON Schema和OpenAPI规范中定义的标准引用格式。本工具支持使用它来标记对象间的引用关系:

{"$ref": "#/path/to/target"}

  • # 表示文档根对象
  • /path/to/target 是从根开始的路径
  • 例如 {"$ref": "#/users/0"} 引用根对象下 users 数组的第0个元素

这在API文档、配置文件等场景中非常常见,用于避免重复定义。

常见修复方案:

  1. 手动移除:在序列化前删除循环属性
  2. 使用replacer函数:JSON.stringify(obj, replacer)中过滤已访问对象
  3. 使用第三方库:circular-jsonflatted等专门处理循环引用的库
  4. 重构数据结构:使用ID引用替代直接对象引用,类似数据库的外键设计
  5. 使用WeakMap跟踪:自定义序列化函数,用WeakMap记录已访问节点

本工具支持两种输入格式:

  • 标准JSON:任何合法的JSON格式,工具会进行结构分析并展示对象树
  • $ref扩展JSON:在标准JSON基础上,使用{"$ref": "#/..."}来表示对象引用,用于模拟和检测循环依赖

标准JSON本质上是树形结构,天然无循环。使用$ref扩展可以模拟真实JavaScript对象中的引用关系。

检测结果中的路径使用点号+方括号表示法:

  • root — 根对象
  • root.users[0] — 根对象的users数组的第0个元素
  • root.users[0].friends[1] — 更深层的路径

循环路径会显示一个闭环,起点和终点指向同一个对象。树形视图中循环节点会有红色边框脉冲动画标记。