JSON.stringify/parse有什么缺点?

JSON 在 JavaScript 中是最为常见的 API 通常用 HTTP 获取 JSON 数据,简单类型数据结构深拷贝等等。这篇文章主要讲解 JSON 的API 和其主要的缺点,以及 JSON5 部分内容。

一、JSON 支持的数据类型

  • 🥇String: 双引号
  • 🥇Number: 整数和浮点型
  • 🥇Boolean: 布尔值
  • 🥇Array:数组
  • 🥇Object: 对象
  • 🥇Null: 空值

二、JSON API

ts 复制代码
JSON.parse(text)
JSON.parse(text, reviver)

JSON.stringify(value[, replacer [, space]])

JSON API 可以被用作深拷贝,但是也有很多的缺点。下面会说明 JSON 的缺点:

三、JSON 的缺点

  • 🥇不能序列化:函数(如果是函数,直接忽略这属性)
  • 🥇无法处理循环引用
  • 🥇限制数据类型,不支持的有
    • 💕RegExp: 结果: 字符串
    • 💕Map: 错误结果:
      • 💨传递不可迭代的对象: xxx is not iterable (cannot read property Symbol(Symbol.iterator))
      • 💨传递可迭代对象(嵌套页需要可迭代):序列化之后是 {}
    • 💕Set
      • 💨可迭代对象:序列化后空对象: {}
      • 💨不得迭代对象:XXX is not iterable (cannot read property Symbol(Symbol.iterator))
    • ...
  • 🥇无法处理某些特殊的值(会被转换成 null)
    • 💕undefined: 字段亏被直接 忽略
    • 💕Symbol: 字段亏被直接 忽略

基本示例

ts 复制代码
let json = {
  date: new Date(),
  b: new Date("1992-05-15"),
  c: function () {},
  r: new RegExp("\\d+"),
  // m: new Map({}), //  object is not iterable (cannot read property Symbol(Symbol.iterator))
  // s: new Set(1) //  object is not iterable (cannot read property Symbol(Symbol.iterator))
  s: Symbol(),
  u: undefined,
};

console.log(JSON.stringify(json));

循环引用

ts 复制代码
// 创建循环引用的对象
const objA = {};
const objB = { a: objA };
objA.b = objB;

// 尝试序列化包含循环引用的对象
try {
  const jsonString = JSON.stringify(objA);
  console.log(jsonString); // 这行代码不会执行,因为在序列化时会抛出错误
} catch (error) {
  console.error('Error:', error.message); // 捕获到错误并打印错误信息
}

在 node.js 中会包出如下的循环引用的错误:

ts 复制代码
Error: Converting circular structure to JSON
    --> starting at object with constructor 'Object'
    |     property 'b' -> object with constructor 'Object'
    --- property 'a' closes the circle

四、JSON5支持的数据类型

  • 🥇多行字符串
  • 🥇注释
  • 🥇数据类型
    • 💕Infinity/-Infinity
    • 💕NaN
    • 💕undefined
  • 🥇末尾逗号
  • 🥇可以省略对象和数组的大括号与方括号
  • 🥇没有使用引号的属性名和字符串

五、认识并 JSON5

💛 json5.org/ json5 的全部

使用 JSON5

ts 复制代码
npm install json5

JSON5 语法

ts 复制代码
JSON5.parse(text[, reviver])

// api
JSON5.stringify(value[, replacer[, space]])
JSON5.stringify(value[, options])

// cli
json5 [options] <file>

六、小结

本文主要讲解 JSON 相关的 API,和 JSON 的缺点。JSON 中的函数在序列化与反序列化的时候会被忽略等等其他的规则。

相关推荐
2401_894915537 小时前
GEO 优化源码全解析:从搜索引擎到 AI 引擎的底层改写逻辑
java·服务器·前端·数据库·人工智能·分布式·搜索引擎
SomeB1oody11 小时前
【RustyML入门】6.3. 并行归约
开发语言·后端·机器学习·rust·教程
Profile排查笔记12 小时前
指纹浏览器哪个好?从 Profile、代理、权限和自动化能力判断是否适合
前端·人工智能·后端·自动化
用户9385156350712 小时前
用 AI 结对编程从 0 搭一个"单词后台管理系统":Next.js + Supabase + Drizzle + shadcn/ui 全记录
后端·postgresql·next.js
lzhdim12 小时前
12、JavaScript常见的内存泄露问题 - JavaScript学习系列文章
开发语言·前端·javascript·学习·ecmascript
denggun1234512 小时前
yield
前端·数据库·python
前端snow12 小时前
ai agent -- prompt汇总
前端
爱学习的小邓同学13 小时前
Golang --- (1)第一个Golang程序
开发语言·后端·golang
小灰灰搞电子14 小时前
Rust+Slint 实现的“DNA双螺旋”加载动画源码分享
后端·rust·slint·加载动画
面向Google编程14 小时前
向量库不再囤数据:Milvus 3.0 零拷贝直读数据湖
后端