让你的对象变得拗口:JSON.stringify(),我把对象夹进了 JSON 魔法帽!

news2024/11/17 16:47:10


  🎬 江城开朗的豌豆:个人主页

 🔥 个人专栏 :《 VUE 》 《 javaScript 》

 📝 个人网站 :《 江城开朗的豌豆🫛 》 

⛺️ 生活的理想,就是为了理想的生活 !

在这里插入图片描述

目录

引言

1. JSON.stringify() 属性

replacer

space

toJSON

2. 应用场景

数据传输

数据存储

#日志记录

数据展示

3. 完整优雅的实现

4. 注意事项

循环引用

特殊类型

性能优化


 

引言

在 JavaScript 中,JSON.stringify() 是一个内置函数,用于将 JavaScript 对象转换为 JSON 字符串。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛用于前后端数据传输和存储。本文将详细介绍 JSON.stringify() 的属性、应用场景,并提供一个完整而优雅的实现,处理循环引用、特殊类型(如日期和正则表达式)以及性能相关的问题。同时,我们还将讨论注意事项和相关引用资料。

1. JSON.stringify() 属性

JSON.stringify() 函数具有以下属性:

replacer

replacer 是一个可选的参数,它可以是一个函数或一个数组。它用于指定需要序列化的对象的属性。当 replacer 是一个函数时,它将被应用于对象的每个属性,可以用来过滤、替换或转换属性的值。当 replacer 是一个数组时,只有数组中包含的属性才会被序列化。

示例:

const obj = {
  name: 'John',
  age: 25,
  address: {
    city: 'New York',
    country: 'USA'
  }
};

const jsonString = JSON.stringify(obj, ['name', 'age']);
console.log(jsonString);
// 输出: {"name":"John","age":25}

space

space 是一个可选的参数,用于控制生成的 JSON 字符串的缩进和格式化。它可以是一个数字表示缩进的空格数,或者是一个字符串表示缩进的字符串。如果 space 是一个非负整数,则每一级缩进使用指定数量的空格;如果 space 是一个字符串,则使用该字符串作为缩进符号。

示例:

const obj = { name: 'John', age: 25 };

const jsonString = JSON.stringify(obj, null, 2);
console.log(jsonString);
// 输出:
// {
//   "name": "John",
//   "age": 25
// }

toJSON

如果要序列化的对象具有 toJSON() 方法,那么该方法将被调用,以便返回可序列化的值。toJSON() 方法可以在对象中定义,用于自定义对象在序列化过程中的行为。

示例:

const obj = {
  name: 'John',
  age: 25,
  toJSON: function() {
    return {
      fullName: this.name,
      yearsOld: this.age
    };
  }
};

const jsonString = JSON.stringify(obj);
console.log(jsonString);
// 输出: {"fullName":"John","yearsOld":25}

2. 应用场景

JSON.stringify() 在以下场景中非常有用:

数据传输

当需要将 JavaScript 对象转换为字符串,以便在网络中传输给后端或其他系统时,可以使用 JSON.stringify() 进行序列化。

const obj = { name: 'John', age: 25 };

const jsonString = JSON.stringify(obj);
console.log(jsonString);
// 输出: {"name":"John","age":25}

数据存储

如果需要将 JavaScript 对象保存到本地存储(如浏览器的 LocalStorage 或数据库),可以使用 JSON.stringify() 将对象转换为 JSON 字符串后进行存储。

const obj = { name: 'John', age: 25 };

const jsonString = JSON.stringify(obj);
localStorage.setItem('user', jsonString);

日志记录

在记录日志时,可以将 JavaScript 对象转换为 JSON 字符串,并将其作为日志消息的一部分。

const obj = { name: 'John', age: 25 };

const logMessage = `User info: ${JSON.stringify(obj)}`;
console.log(logMessage);

数据展示

将 JavaScript 对象转换为 JSON 字符串后,可以方便地在前端页面中展示、渲染或打印。

const obj = { name: 'John', age: 25 };

const jsonString = JSON.stringify(obj);
document.getElementById('user-info').textContent = jsonString;

3. 完整优雅的实现

下面是一个完整且优雅的 JSON.stringify() 实现,它考虑了处理循环引用、日期和正则表达式等特殊类型,并尽量保持了性能优化。

function stringify(obj) {
  const seen = new WeakSet(); // 用于检测循环引用
  const typeMap = {
    '[object Date]': 'Date',
    '[object RegExp]': 'RegExp',
  };

  function isObject(value) {
    return typeof value === 'object' && value !== null;
  }

  function handleSpecialTypes(value) {
    if (value instanceof Date) {
      return { type: 'Date', value: value.toISOString() };
    } else if (value instanceof RegExp) {
      return { type: 'RegExp', value: value.toString() };
    }
    return value;
  }

  function replacer(key, value) {
    if (seen.has(value)) {
      throw new TypeError('Converting circular structure to JSON');
    }

    if (isObject(value)) {
      seen.add(value);
    }

    value = handleSpecialTypes(value);

    return value;
  }

  function stringifyHelper(obj) {
    if (isObject(obj)) {
      if (Array.isArray(obj)) {
        return '[' + obj.map((item) => stringifyHelper(item)).join(',') + ']';
      } else {
        const properties = Object.keys(obj)
          .map((key) => `"${key}":${stringifyHelper(obj[key])}`)
          .join(',');
        return `{${properties}}`;
      }
    } else {
      return JSON.stringify(obj, replacer);
    }
  }

  return stringifyHelper(obj);
}

此实现使用了递归和一些辅助函数来处理不同的数据类型。它会检查循环引用并抛出错误,处理特殊类型(如日期和正则表达式),并使用递归进行深度优先遍历。

请注意,此实现仅为简化示例,对于更复杂的场景可能需要进行更多的处理和优化。建议在实际使用中参考第三方库或更全面的文档和资源。

4. 注意事项

在使用

JSON.stringify() 时,需要注意以下事项:

循环引用

如果要序列化的对象存在循环引用,即对象之间相互引用,会导致无限递归的情况。为了避免死循环,可以使用 WeakSet 或其他方式来检测循环引用,并在检测到循环引用时抛出错误或采取其他处理方式。

特殊类型

特殊类型(如日期和正则表达式)需要进行适当的处理,以确保正确的序列化和反序列化。

性能优化

JSON.stringify() 可能会在处理大型对象或嵌套层次较深的对象时产生性能问题。为了提高性能,可以考虑使用更高效的算法或采用其他优化策略。

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

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

相关文章

Gartner中国零信任网络访问市场指南发布!持安科技获评代表厂商

近日,全球权威市场研究与咨询机构Gartner发布《中国零信任网络访问市场指南》。其中,零信任办公安全企业持安科技入选为中国零信任网络访问领域“代表厂商”。 市场指南报告(Market Guide)是Gartner基于技术发展、落地案例等进行严…

Linux 实时补丁开启内核抢占了吗?

Linux 实时补丁开启内核抢占了吗? 开启了。 查看Linux实时补丁,发现修了如下内核宏: PREEMPT_RT补丁的关键点是最小化不可抢占的内核代码量,同时最小化为了提供这种额外的可抢占性而必须更改的代码量。特别是,临界区…

深度学习DAY3:激活函数

激活函数映射——引入非线性性质 h (Σ(W * X)b) yσ(h) 将h的值通过激活函数σ映射到一个特定的输出范围内的一个值,通常是[0, 1]或[-1, 1] 1 Sigmoid激活函数 逻辑回归LR模型的激活函数 Sigmoid函数&#xff0…

竞赛 深度学习 大数据 股票预测系统 - python lstm

文章目录 0 前言1 课题意义1.1 股票预测主流方法 2 什么是LSTM2.1 循环神经网络2.1 LSTM诞生 2 如何用LSTM做股票预测2.1 算法构建流程2.2 部分代码 3 实现效果3.1 数据3.2 预测结果项目运行展示开发环境数据获取 最后 0 前言 🔥 优质竞赛项目系列,今天…

Bootstrap中让元素尽可能往父容器的左侧靠近或右侧造近(左浮动和右浮动)

在Bootstrap中,float-left是一个用于浮动元素的CSS类。它的作用是将一个元素向左浮动,使其在父容器内尽可能靠近左侧边缘,同时允许其他元素在其右侧排列。 使用float-left类可以创建多列布局,将元素水平排列在一行上,…

【脑机接口论文与代码】High-speed spelling with a noninvasive brain–computer interface

High-speed spelling with a noninvasive brain–computer interface 中文题目 :非侵入性的高速拼写脑机接口论文下载算法程序下载摘要1 项目介绍2 方法2.1SSVEPs的基波和谐波分量JFPM刺激产生算法2.3基波和谐波SSVEP分量的幅度谱和信噪比 3讨论4实验环境设置与方法…

全球邮企业邮箱服务比较:找寻最佳选择

“全球邮企业邮箱服务比较:Gmail、Outlook、Yahoo Mail、Zoho Mail,更适合中国用户的是Zoho Mail。” 在全球化的商业环境中,企业邮箱已经成为了一种重要的沟通工具。它不仅提供了安全、可靠的电子邮件服务,而且还能够集成其他企业…

hive add columns 后查询不到新字段数据的问题

分区表add columns 查询不到新增字段数据的问题; 5.1元数据管理 (1)基本架构 Hive的2个重要组件:hiveService2 和metastore,一个负责转成MR进行执行,一个负责元数据服务管理 beeline-->hiveService2/spar…

性能分析与调优(硬核分享)

前言 常看到性能测试书中说,性能测试不单单是性能测试工程师一个人的事儿。需要DBA 、开发人员、运维人员的配合完成。但是在不少情况下性能测试是由性能测试人员独立完成的,退一步就算由其它人员的协助,了解系统架构的的各个模块对于自身的…

MAX4/11/03/016/08/1/1/00 MAX-4/11/01/008/08/1/1/00

MAX4/11/03/016/08/1/1/00 MAX-4/11/01/008/08/1/1/00 sales force宣布推出制造业云(Manufacturing Cloud),这是一款面向制造商的行业专用产品。制造云致力于将销售和运营团队聚集在统一的市场和客户需求视图周围,目标是更准确地预测、规划和推动可预测…

口袋参谋:如何对宝贝关键词进行词根分析?用它就对了!

​为什么宝贝转化不好?90%的原因是宝贝关键词没选好,关键词选择得不好,会出现点击率、展现、访客、收藏加购率等数据降低的情况,还会导致关键词质量得分波动大,甚至影响整个店铺的经营。 所以对电商卖家来说&#xff…

微信照片过期打不开怎么办?用这个办法可找回

时间太久想找之前的聊天图片 却发现图片已被清理 因为忙碌或者在外游玩一时间忘了点开 想起要找回的时候却发现已经过期 不妨试试这样几个找回小方法 PART2 图片找回 收藏和搜一搜找回 长按要找回的图片 点击收藏或搜一搜 不能保证百分百的成功率哦 存储空间找回 打开【存…

性能测试-如何进行监控设计

监控设计步骤 首先,你要分析系统的架构。在知道架构中使用的组件之后,再针对每个组件进行监控。 其次,监控要有层次,要有步骤。先全局,后定向定量分析。 最后,通过分析全局、定向、分层的监控数据做分析…

多个微信怎么实现自动回复、自动通过好友自动打招呼?

你是否有遇到这个问题? 1、微信号太多,为了能及时回复消息,经常带多台手机,重且不好携带。 2、多个微信号来回切换导致没及时通过客户好友申请,导致客户流失。 3、每天需要手动添加和通过好友申请来管理微信客户&am…

DC/DC开关电源学习笔记(十二)Boost升压电路仿真及工程应用案例

(十二)Boost升压电路仿真及工程应用案例 1.Boost电路仿真案例2.Boost电路工程应用实例1.Boost电路仿真案例 指标参数:输入电压5V,输出电压12V,输出电流1A,开关频率10kHz,电压纹波0.5%。 根据输入指标参数确定CCM模式下各个关键元器件测参数: 负载电阻Rl=12R 占空比D=6…

同步云盘:理解云端数据的实时同步技术

同步云盘是一种基于云计算技术的存储和文件同步服务 什么是同步云盘? 同步云盘是一种基于云计算技术的存储和文件同步服务。它允许用户将文件上传到云端,并在多个设备之间同步和共享这些文件。通过同步云盘,用户可以轻松地在不同设备上访问和…

LeetCode【42】接雨水

题目&#xff1a; 思路&#xff1a; https://blog.csdn.net/weixin_45345143/article/details/128178541 代码&#xff1a; public int trap(int[] height) {int n height.length;int[] leftHeight new int[n];leftHeight[0] height[0];for (int i 1; i < n; i) {lef…

项目工作中的有效沟通:提升团队协作效率的关键

对于项目管理者来说&#xff0c;沟通可能在日常管理工作中占据绝大部分。因此有效积极的沟通在项目管理工作中是十分重要的。那么在项目工作中如何进行有效的沟通呢&#xff1f; 在日常项目管理工作中&#xff0c;主要涉及和客户的沟通&#xff0c;与团队的沟通。 和客户的沟…

Go语言错误处理最佳实践

错误处理实践 我们在go语言中设计error的处理体系时候, 一般都会去做下面两点 直接使用errors.New()生成error接口的值 扩展error接口, 并定义扩展error接口的实现类型 error接口是什么? go语言的error是一个接口类型, 其源码如下: type error interface {Error() string…

Springboot 接收POST、json、文本数据实践

一、接收 Form 表单数据 1&#xff0c;基本的接收方法 &#xff08;1&#xff09;下面样例 Controller 接收 form-data 格式的 POST 数据&#xff1a; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.Request…