新闻中心

J*aScriptJSON序列化_循环引用与自定义解析

2025-11-25
浏览次数:
返回列表
答案:使用 replacer 函数结合 WeakSet 可解决循环引用并自定义序列化逻辑,或引入 flatted 等库实现完整结构还原,同时利用 replacer 与 reviver 控制字段过滤与类型转换。

javascriptjson序列化_循环引用与自定义解析

在使用 J*aScript 的 JSON.stringify() 方法进行对象序列化时,遇到循环引用会抛出错误。同时,在某些场景下,我们希望对序列化过程进行自定义控制,比如过滤字段或处理特殊类型。本文将说明如何解决循环引用问题,并实现自定义的 JSON 序列化与解析逻辑。

循环引用导致的问题

当一个对象的属性直接或间接引用自身时,就构成了循环引用。例如:

const obj = { name: "Alice" };
obj.self = obj;
JSON.stringify(obj); // 抛出 TypeError: Converting circular structure to JSON

浏览器和 Node.js 环境下的原生 JSON.stringify 无法处理这种结构,会立即中断并报错。

解决方案:使用 replacer 函数过滤引用

可以通过传入 replacer 函数来跳过特定属性。虽然不能直接检测所有循环引用,但可以结合 WeakSet 手动追踪已访问的对象:

function stringifySafe(obj) {
  const seen = new WeakSet();
  return JSON.stringify(obj, (key, value) => {
    if (typeof value === "object" && value !== null) {
      if (seen.has(value)) {
        return "[Circular]";
      }
      seen.add(value);
    }
    return value;
  });
}

这个方法能在序列化过程中识别重复引用,避免崩溃,同时用标记字符串代替循环部分,保留其余数据结构。

使用第三方库简化处理

对于复杂项目,推荐使用专门处理循环引用的库,如 flattedcycle

flatted 为例:

eMart 网店系统 eMart 网店系统

功能列表:底层程序与前台页面分离的效果,对页面的修改无需改动任何程序代码。完善的标签系统,支持自定义标签,公用标签,快捷标签,动态标签,静态标签等等,支持标签内的vbs语法,原则上运用这些标签可以制作出任何想要的页面效果。兼容原来的栏目系统,可以很方便的插入一个栏目或者一个栏目组到页面的任何位置。底层模版解析程序具有非常高的效率,稳定性和容错性,即使模版中有错误的标签也不会影响页面的显示。所有的标

eMart 网店系统 0 查看详情 eMart 网店系统
import { stringify, parse } from 'flatted';

const obj = { name: "Bob" };
obj.self = obj;

const str = stringify(obj); // 成功序列化
const recovered = parse(str); // 正确还原结构

这类库通过扁平化结构记录引用关系,能完整保存和恢复循环引用,适合需要精确还原的场景。

自定义序列化与反序列化逻辑

除了处理循环引用,有时还需控制哪些字段被序列化,或转换日期、函数等非标准类型。

replacerreviver 参数提供了这样的能力:

  • replacer:在序列化前筛选或转换值
  • reviver:在反序列化后修正或重建值
const user = {
  name: "Charlie",
  password: "123456", // 敏感字段
  createdAt: new Date()
};

// 自定义序列化:隐藏密码,转换日期为时间戳
const json = JSON.stringify(user, (key, value) => {
  if (key === "password") return undefined;
  if (value instanceof Date) return value.getTime();
  return value;
});

// 反序列化时恢复日期对象
const parsed = JSON.parse(json, (key, value) => {
  if (key === "createdAt") return new Date(value);
  return value;
});

这样可以在传输中精简数据,同时保证关键信息正确重建。

基本上就这些。处理循环引用和自定义解析并不复杂,关键是理解 replacerreviver 的执行时机,并根据需求选择手动控制或引入可靠工具库。

以上就是J*aScriptJSON序列化_循环引用与自定义解析的详细内容,更多请关注其它相关文章!


# word  # 网站推广订单怎么做的好  # 链接seo的优化  # 天津天猫网站推广简介  # 新乡网站建设怎么选  # 心理医院网站建设  # 按需  # 化与  # 如何用  # 抛出  # 管理器  # 数据结构  # 如何使用  # 序列化  # javascript  # java  # js  # node.js  # json  # node  # 浏览器  # 工具  # red  # 自定义  # 网店  # 池州企业网站排名推广  # 山东智能门锁网站建设  # 福建台州网站建设  # SEO专员找工作  # 济南网站建设我们最专业 


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


相关推荐: 淘宝支付提示失败如何解决 淘宝支付流程优化方法  正确连接J*aScript到HTML实现可点击图片与自定义事件处理  AO3最新镜像入口 Archive of Our Own官方平台访问  虚幻5科幻题材ARPG大作遭取消!本是《奇异人生》厂商新作  汽水音乐在线版入口_汽水音乐网页播放手册  C#中解析不规范的HTML为XML 常见的坑与解决办法  极速漫画官方主页网址 极速漫画漫画在线浏览官网链接  浏览器打开即用 美图秀秀网页版入口  铃兰之剑为这和平的世界希里技能组及加点推荐  斑马英语APP如何开启夜间护眼阅读_斑马英语APP夜间模式与低蓝光设置教程  护手霜蹭到袖口上了如何清洗? 怎样避免留下一圈油印?  在python-socketio事件处理器中安全访问Flask应用上下文  在Go开发中优雅管理ListenAndServe进程:GoSublime集成方案  在FastAPI中利用lifespan与依赖注入高效管理Redis连接池  css绝对定位元素脱离父容器怎么办_确保父元素position非static  支付宝如何设置安全保护_支付宝安全设置的全面教程  Yandex官方入口网址 Yandex俄罗斯搜索引擎最新在线地址  漫蛙2在线漫画入口 漫蛙正版漫画网页版直达  抓大鹅解压小游戏 抓大鹅摸鱼解压入口  如何使用CaptainHook和Composer管理Git钩子_在提交前自动运行代码检查的Composer配置  在Pyomo中实现基于变量的条件约束:Big-M方法详解  sublime侧边栏怎么增强功能_SideBarEnhancements for sublime安装与配置  如何为你的Composer包编写自动化测试_集成PHPUnit到Composer的scripts工作流  Go调试环境为何无法启动_Go调试器启动失败原因与解决策略  4399网页游戏电脑版全新入口 4399电脑端在线玩指南  CSS自定义字体样式被系统字体替换怎么办_font-face方式指定font-display控制渲染策略  192.168.1.1管理中心入口 192.168.1.1路由器网页设置平台  lar*el怎么安全地存储和获取配置文件中的敏感信息_lar*el敏感信息安全存储方法  如何在J*a中实现统一对象行为接口_项目大型化时的接口规范化  C++ explicit关键字防止隐式转换_C++构造函数安全规范  蛙漫限时开放最深处链接_蛙漫全站漫画会员同款秒开地址  现代化 SciPy 一维插值:interp1d 的替代方案与最佳实践  拼多多赚钱渠道_拼多多收益来源  在J*a中如何开发在线活动报名与管理系统_活动报名管理项目实战解析  PHP中高效并行检查多链接状态的教程  神庙逃亡小游戏在线玩 神庙逃亡小游戏入口  cad如何更改注释性对象的比例_cad注释性比例调整方法  Descript怎样用AI剪辑自动去噪_Descript用AI剪辑自动去噪【自动降噪】  c++中的const_cast和reinterpret_cast怎么用_c++四种类型转换  如何使用spryker/configurable-bundles-products-resource-relationship模块解决复杂产品捆绑关系难题  Excel文件在线转换快速入口 Excel在线格式转换网站  Golang如何实现Web文件静态资源服务器_Golang静态资源服务器开发与实践  Go语言中JSON数据解码与字段访问指南  不会效仿卡普空!《铁拳》制作人澄清:不采取赛事付费|直播|  Win10如何清理注册表垃圾 Win10手动清理无效注册表【技巧】  Bing引擎入口最新2025 Bing搜索免费官方登录  PDF文件体积过大处理_PDF压缩技巧详解  Python:递归比较文件夹内容并找出特定类型文件的差异  sublime怎么覆盖插件的默认快捷键_sublime快捷键优先级与设置  AO3官方可用镜像 Archive of Our Own网页版最新入口 

搜索