备忘录写法都比较个人化,看官请随意…

基本概念

JSON = JavaScript Object Notation 是一种独立的语法。

支持数据类型:

  • Number
  • String
  • Boolean
  • Array
  • Object
  • Null

本质上就是遵从某种规范的 字符串

JSON 内涉及字符串类型的必须用 双引号 表示。

JSON.stringify 使用

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

返回:序列化后的 JSON 字符串

参数

value:要 JSON 序列化的值。

replacer

  • Function:被序列化的值的每个属性都会经过该函数的转换和处理,函数参数为(k,v),初始 k 为空字符串,v 为传入的 value 值;
  • Array:只有这个数组中的属性名才会被序列化到最终的 JSON 字符串中;
  • 留空/other:对象所有的属性都会被序列化;

space:指定缩进用的空白字符串,用于美化输出。

  • Number:设置空格数量(最长10);
  • String:设置空格数量和指定字符(最长10);
  • 留空/other:空字符串;
JSON.stringify(
[undefined, Object, Symbol("")],
null,
'😂😂😂😂😂😂😂😂😂😂'
);

// 结果
"[
😂😂😂😂😂null,
😂😂😂😂😂null,
😂😂😂😂😂null
]"

解析规则

假定某一要序列化的属性值为 v

  1. v 类型为 Object,且有 toJSON 方法:设定 v 为该函数返回值,等待下一步处理。

  2. 有 replacer 函数:设定 v 为该函数返回值,等待下一步处理。

  3. v 为基础类型的包装对象:转化 v 为相应基础类型值,等待下一步处理。

  4. v 类型为 null:返回字符串 “null”

  5. v 类型为 Boolean:返回相应字符串 “true”/“false”

  6. v 类型为 String:返回双引号字符串,有些编码不会转义\b \t \n \f \r \" \\,会原样输出。只有有限的一些字符可能会被转义;禁止某些控制字符;

  7. v 类型为 Number:有限值返回相应字符串,其它返回 “null”

  8. v 类型为 Array:对于数组每一项值都会重新走一遍本解析规则,返回相应值,如果一直走到最后即步骤10,则返回 “null”

  9. v 类型为 Object,且不是函数:对自身的所有可枚举值,走一遍本解析规则,返回相应值。

  10. 返回 undefined

注意:

  • 对象包含循环引用,会抛错。
  • 最后一步返回 undefined,本质上就是忽略这一键值对处理。所以碰上 undefined、函数、Symbol 等等其它类型都会忽略处理;数组中碰上的话,见步骤8
  • 不可枚举的属性会被忽略,见步骤9

JSON.parse 使用

JSON.parse(text [, reviver])

返回:JavaScript 类型值。

参数

text:要解析的 JSON 序列化值。

reviver:转换器函数,可以用来修改解析生成的原始值。函数参数为(k,v)。注意解析到顶层时,k 为空字符串,v 为解析后的顶层值。

JSON.parse('{"p": 5}', function (k, v) {
// 如果到了顶层,直接返回属性值
if(k === '') return v;

// 否则将属性值变为原来的 2 倍
return v * 2;
});

// 结果
{p: 10}