JSON
JSON
是一种语法,它不是 JS
的子集,所以不能被调用,也不能作为构造函数。
与 JS
的区别:
- 数组和对象:属性名必须是双引号的字符串,最后一个属性后不能有逗号;
- 数值:禁止出现前导零,如果有小数点,则后面至少跟着一位数字;
- 字符串:只有有限的一些字符可能会被转义,字符串必须用双引号括起来;
方法
JSON.parse()
解析 JSON
字符串并返回对应的值,可以额外传入一个转换函数,用来将生成的值和其属性,在返回之前进行某些修改。
js
/**
* @param { String } text 要被解析成 JavaScript 值的字符串
* @param { Function } [reviver] 转换器,可以修改解析生成的原始值
* @return { Object } 对应给定 JSON 文本的对象/值。
*/
JSON.parse(text[, reviver])
/**
* @param { String } text 要被解析成 JavaScript 值的字符串
* @param { Function } [reviver] 转换器,可以修改解析生成的原始值
* @return { Object } 对应给定 JSON 文本的对象/值。
*/
JSON.parse(text[, reviver])
注意:若传入的字符串不符合 JSON
规范,则会抛出 SyntaxError
异常。
JS
JSON.parse('{"p": 5}', function (k, v) {
if(k === '') return v; // 如果到了最顶层,则直接返回属性值,
return v * 2; // 否则将属性值变为原来的 2 倍。
}); // { p: 10 }
JSON.parse('{"p": 5}', function (k, v) {
if(k === '') return v; // 如果到了最顶层,则直接返回属性值,
return v * 2; // 否则将属性值变为原来的 2 倍。
}); // { p: 10 }
JSON.stringify()
返回与指定值对应的 JSON
字符串,可以通过额外的参数,控制仅包含某些属性,或者以自定义方法来替换某些 key
对应的属性值。
JS
/**
* @param { JSON } json 将要序列化成 一个 JSON 字符串的值
* @param { Function, Array, null, undefined } [replacer] 如果该参数是一个函数,则在序列化过程中,被序列化的值的每个属性都会经过该函数的转换和处理;如果该参数是一个数组,则只有包含在这个数组中的属性名才会被序列化到最终的 JSON 字符串中;如果该参数为 null 或者未提供,则对象所有的属性都会被序列化。
* @param { Number, String } [space] 指定缩进用的空白字符串,用于美化输出(pretty-print);如果参数是个数字,它代表有多少的空格;上限为 10。该值若小于 1,则意味着没有空格;如果该参数为字符串(当字符串长度超过 10 个字母,取其前 10 个字母),该字符串将被作为空格;如果该参数没有提供(或者为 null),将没有空格。
* @return { String } 一个表示给定值的 JSON 字符串。
*/
JSON.stringify(value[, replacer [, space]])
/**
* @param { JSON } json 将要序列化成 一个 JSON 字符串的值
* @param { Function, Array, null, undefined } [replacer] 如果该参数是一个函数,则在序列化过程中,被序列化的值的每个属性都会经过该函数的转换和处理;如果该参数是一个数组,则只有包含在这个数组中的属性名才会被序列化到最终的 JSON 字符串中;如果该参数为 null 或者未提供,则对象所有的属性都会被序列化。
* @param { Number, String } [space] 指定缩进用的空白字符串,用于美化输出(pretty-print);如果参数是个数字,它代表有多少的空格;上限为 10。该值若小于 1,则意味着没有空格;如果该参数为字符串(当字符串长度超过 10 个字母,取其前 10 个字母),该字符串将被作为空格;如果该参数没有提供(或者为 null),将没有空格。
* @return { String } 一个表示给定值的 JSON 字符串。
*/
JSON.stringify(value[, replacer [, space]])
注意:
- 当在循环引用时会抛出异常
TypeError
("cyclic object value
")(循环对象值) - 当尝试去转换
BigInt
类型的值会抛出TypeError
("BigInt value can't be serialized in JSON")(BigInt
值不能JSON
序列化)
使用 JSON 序列化实现深拷贝
JSON
序列化会丢失部分属性,如下:
- 内置对象
Data
会被转为字符串; undefined
与function
会丢失;- 当对象中的
NaN
、Infinity
和-Infinity
三种属性的值会转为null
; RegExp、Error
对象会被转为{}
(空对象)JSON.stringify()
只能序列化可枚举的自有属性- 对象循环引用会抛出异常