Skip to content
本页目录

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 会被转为字符串;
  • undefinedfunction 会丢失;
  • 当对象中的 NaNInfinity-Infinity 三种属性的值会转为 null
  • RegExp、Error 对象会被转为 {} (空对象)
  • JSON.stringify() 只能序列化可枚举的自有属性
  • 对象循环引用会抛出异常