TypeError: JSON.stringify cannot serialize cyclic structures

在这里插入图片描述

🤍 前端开发工程师、技术日更博主、已过CET6
🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1
🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》
🍚 蓝桥云课签约作者、上架课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入门到实战全面掌握 uni-app》

文章目录

    • 问题描述
    • 原因分析
    • 解决方案
      • 1. 使用 `JSON.stringify` 的第二个参数(replacer)
      • 2. 使用第三方库
      • 3. 避免循环引用
    • 实战案例
    • 总结

问题描述

在JavaScript开发过程中,开发者经常会遇到 TypeError: JSON.stringify cannot serialize cyclic structures 的错误提示。该错误通常表示在尝试将包含循环引用的对象序列化为JSON字符串时,序列化过程无法完成而抛出错误。

原因分析

  1. 循环引用:对象之间相互引用,形成无限循环。例如:

    const obj = {};
    obj.self = obj;
    JSON.stringify(obj); // TypeError: Converting circular structure to JSON
    

    在这个例子中,objself 属性指向了 obj 本身,导致序列化时陷入无限循环。

  2. JSON.stringify的限制:JSON.stringify 无法处理循环引用,因为无法确定循环的终止点,从而引发错误。

解决方案

1. 使用 JSON.stringify 的第二个参数(replacer)

可以通过自定义replacer函数来处理循环引用。replacer函数可以检查对象中的属性是否是循环引用,并返回适当的值以避免错误。例如:

function stringifyWithCircularRef(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;
    });
}

const obj = { name: 'John' };
obj.self = obj;
console.log(stringifyWithCircularRef(obj)); // 输出: '{"name":"John","self":"[Circular]"}'

2. 使用第三方库

可以使用第三方库来处理循环引用,例如 circular-jsonflatted。这些库提供了更强大的序列化功能,能够处理循环引用和其他复杂的数据结构。

3. 避免循环引用

在设计和实现数据结构时,尽量避免循环引用。可以通过设计良好的数据模型和使用适当的数据结构(如Map)来避免循环引用。

实战案例

假设有一个对象包含循环引用,需要将其序列化为JSON字符串:

const obj = { name: 'John' };
obj.self = obj;

try {
    const jsonString = JSON.stringify(obj);
    console.log(jsonString);
} catch (error) {
    console.error('JSON.stringify error:', error.message);
}

解决方案是使用自定义replacer函数:

function stringifyWithCircularRef(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;
    });
}

const obj = { name: 'John' };
obj.self = obj;
console.log(stringifyWithCircularRef(obj)); // 输出: '{"name":"John","self":"[Circular]"}'

总结

TypeError: JSON.stringify cannot serialize cyclic structures 错误通常是由于对象包含循环引用而引起的。通过以下方法可以有效避免该问题:

  1. 使用 JSON.stringify 的第二个参数(replacer):自定义replacer函数来处理循环引用。
  2. 使用第三方库:使用 circular-jsonflatted 等第三方库来处理复杂的序列化需求。
  3. 避免循环引用:在设计和实现数据结构时,尽量避免循环引用。

通过这些方法,开发者可以提高代码的健壮性,减少运行时错误,提升应用的稳定性和用户体验。建议开发者定期检查和测试代码,确保所有数据结构在序列化前都不包含循环引用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Manus邀请码申请与获取全攻略

大家好,我是吾鳴。 之前吾鳴给大家分享过一篇Manus的介绍文章——《全网疯抢邀请码的Manus到底是个啥?看完这篇你就懂了!》,介绍了Manus是什么、与DeepSeek有些什么区别、生活中的应用场景以及工作中的应用场景。 今天吾鳴给大家分…

c++实现最大公因数和最小公倍数

最大公因数和最小公倍数的介绍 读这篇文章,请你先对最大公因数以及最小公倍数进行了解: 最大公因数(英文名:gcd) 定义:最大公因数,也称最大公约数,指两个或多个整数共有约数&…

Jetpack Compose — 入门实践

一、项目中使用 Jetpack Compose 从此节开始,为方便起见,如无特殊说明,Compose 均指代 Jetpack Compose。 开发工具: Android Studio 1.1 创建支持 Compose 新应用 新版 Android Studio 默认创建新项目即为 Compose 项目。 注意:在 Language 下拉菜单中,Kotlin 是唯一可…

PAM4信号技术

概述 PAM4(4-Level Pulse Amplitude Modulation)是一种四电平脉冲幅度调制技术,广泛应用于高速数据传输,特别是在100Gbps及以上的通信系统中。与传统的NRZ(Non-Return-to-Zero)相比,PAM4通过在每个符号周期内传输2个比特的信息,显著提升了数据传输效率。随着5G网络的发…

Visual Studio 2022新建c语言项目的详细步骤

步骤1:点击创建新项目 步骤2:到了项目模板 --> 选择“控制台应用” (在window终端运行代码。默认打印"Hello World") --> 点击 “下一步” 步骤3:到了配置新项目模块 --> 输入“项目名称” --> 更改“位置”路径&…

【UCB CS 61B SP24】 Lecture 25 26 - Minimum Spanning Trees 学习笔记

本文介绍了图论中的另一个经典问题:最小生成树(MST),讲解并用 Java 实现了用于求解 MST 的两个经典算法 Prim 与 Kruskal。 1. 最小生成树介绍 最小生成树(Minimum Spanning Tree,MST)是图论中…

“此电脑”中删除WPS云盘方法(百度网盘通用)

📣此方法适用于卸载WPS云盘后,WPS云盘图标依然在此电脑中显示的问题。 原理:通过注册来进行删除 步骤: WIN键R,打开运行窗口,输入regedit命令,来打开【注册表编辑器】; 从左侧,依…

鸿蒙跨平台框架ArkUI-X

01 引言 目前,移动端主流跨平台方案有Flutter、React Native、uni-app等等,还有刚推出不久的Compose-Multiplatform,真所谓是百花齐放。这些框架各有特点,技术实现各有差异,比如Flutter通过Dart编写的UI描述对接Flutte…

关于更新字段为空值——MybatisPlus框架

背景:我们在项目开发过程中,可能会经常遇到这样的问题,某个前端的字段,用户把原本有值的改为空值了,用户的意愿肯定是要去更新的,前端此时会把这个字段传"null"或空字符串,但我们后端…

CherryStudio调用DeepSeek API实现AI对话

目录 一、CherryStudio是什么?二、下载安装CherryStudio三、调用DeepSeek API(以华为云为例)1.新建服务模型2.获取API Key和API 地址3.添加模型检查连接 四、体验刚建立成功的deepseek五、总结 一、CherryStudio是什么? CherrySt…

夜莺监控 v8.0 新版通知规则 | 对接钉钉告警

对新版本通知规则还不太了解的用户可以阅读文章:《夜莺监控巨大革新:抽象出通知规则,增强告警通知的灵活性》。下面我们将以钉钉通知为例,介绍如何使用新版通知规则来对接钉钉通知。 上图是通知规则对接钉钉通知的示意逻辑图。 在…

pycharm找不到conda可执行文件

conda 24.9.2 在pycharm的右下角就可以切换python解释器了

第六课:数据库集成:MongoDB与Mongoose技术应用

本文详细介绍了如何在Node.js应用程序中集成MongoDB数据库,并使用Mongoose库进行数据操作。我们将涵盖MongoDB在Ubuntu 20系统中的安装、Bash命令的CRUD操作、Mongoose数据建模(Schema/Model)、关联查询与聚合管道,以及实战案例—…

小谈java内存马

基础知识 (代码功底不好,就找ai优化了一下) Java内存马是一种利用Java虚拟机(JVM)动态特性(如类加载机制、反射技术等)在内存中注入恶意代码的攻击手段。它不需要在磁盘上写入文件&#xff0c…

Swift系列01-Swift语言基本原理与设计哲学

本文将深入探讨Swift的核心原理、设计理念以及与Objective-C的对比 1. Swift与Objective-C的架构差异分析 Swift和Objective-C尽管可以无缝协作,但它们的架构设计存在本质差异。 1.1语言范式 Objective-C是一种动态语言,建立在C语言之上并添加了Smal…

解决:Word 保存文档失败,重启电脑后,Word 在试图打开文件时遇到错误

杀千刀的微软,设计的 Word 是个几把,用 LaTex 写完公式,然后保存,卡的飞起 我看文档卡了很久,就关闭文档,然后 TMD 脑抽了重启电脑 重启之后,文档打不开了,显示 杀千刀的&#xff…

把握好自己的节奏, 别让世界成为你的发条匠

我见过凌晨两点还在回复工作群消息的职场妈妈,也见过凌晨三点抱着手机刷短视频的年轻人。 地铁站台的上班族永远在狂奔,连刚会走路的小孩都被早教班塞满了日程表。 现如今生活节奏快,像一只巨大的发条,每个人都被拧得紧紧的&#…

大型语言模型训练的三个阶段:Pre-Train、Instruction Fine-tuning、RLHF (PPO / DPO / GRPO)

前言 如果你对这篇文章可感兴趣,可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」,查看完整博客分类与对应链接。 当前的大型语言模型训练大致可以分为如下三个阶段: Pre-train:根据大量可获得的文本资料&#…

LeetCode 解题思路 12(Hot 100)

解题思路: 定义三个指针: prev(前驱节点)、current(当前节点)、nextNode(临时保存下一个节点)遍历链表: 每次将 current.next 指向 prev,移动指针直到 curre…

【情境领导者】评估情境——什么是准备度

本系列是看了《情境领导者》一书,结合自己工作的实践经验所做的学习笔记。 准备度是指完成某一项特定的工作所表现出来的能力和意愿水平。 能力:是个人或组织在某一项特定工作或活动所表现出的知识、经验与技能。 意愿:是指个人或组织完成某一…