什么是 JSON
JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。它基于 ECMAScript (w3c 制定的 js 规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
本文地址:http://tigerliu.site/2017/06/json/
- JSON 与 JS 对象的区别
- JSON.stringify()
- JSON.parse()
- JSON.stringify() –>toJSON 的使用
1. JSON 与 JS 对象的区别
JSON 是可以传输的,因为它是文本格式,但是 JS 对象是没办法传输的,在语法上,JSON 也会更加严格,但是 JS 对象就很松了
对比内容 | JSON | JS 对象 |
---|---|---|
键名 | 必须加双引号 | 可允许不加、加单引号、加双引号 |
属性值 | 只能是数值(10 进制)、字符串(双引号)、布尔值和 null,也可以是数组或者符合 JSON 要求的对象,不能是函数、NaN,Infinity,-Infinity 和 undefined | 爱啥啥 |
逗号问题 | 最后一个属性后面不能有逗号 | 可以 |
数值 | 前导 0 不能用,小数点后必须有数字 | 没限制 |
json 不是 JS 的子集
1 | var code = '"\u2028\u2029"'; |
这两个字符\u2028 和\u2029 分别表示行分隔符和段落分隔符,JSON.parse 可以正常解析,但是当做 js 解析时会报错
2. JSON.stringify()
规则:
JSON.stringify(value[, replacer [, space]])
- 第二个参数可以是函数,也可以是一个数组
- 如果第二个参数是一个函数,那么序列化过程中的每个属性都会被这个函数转化和处理
- 如果第二个参数是一个数组,那么只有包含在这个数组中的属性才会被序列化到最终的 JSON 字符串中
- 如果第二个参数是 null,那作用上和空着没啥区别,但是不想设置第二个参数,只是想设置第三个参数的时候,就可以设置第二个参数为 null
- 第三个参数用于美化输出——不建议用
注意:
- 键名不是双引号的(包括没有引号或者是单引号),会自动变成双引号;字符串是单引号的,会自动变成双引号
- 最后一个属性后面有逗号的,会被自动去掉
- 非数组对象的属性不能保证以特定的顺序出现在序列化后的字符串中 这个好理解,也就是对非数组对象在最终字符串中不保证属性顺序和原来一致
- 布尔值、数字、字符串的包装对象在序列化过程中会自动转换成对应的原始值
- 也就是你的什么 new String(“bala”)会变成”bala”,new Number(2017)会变成 2017
- undefined、任意的函数,以及 symbol 值(symbol 详见 ES6 对 symbol 的介绍)
3. JSON.parse()
规则:
JSON.parse(text[, reviver])
值得注意的是这里有一个可选的第二个参数,这个参数必须是一个函数,这个函数作用在属性已经被解析但是还没返回前,将属性处理后再返回
注意:
- 如果 reviver 返回 undefined,则当前属性会从所属对象中删除,如果返回了其他值,则返回的值会成为当前属性新的属性值。
- 你可以注意到上面例子最后一组输出看上去没有 key,其实这个 key 是一个空字符串,而最后的 object 是最后解析完成对象,因为到了最上层,已经没有真正的属性了
4. JSON.stringify() –>toJSON 的使用
如果你在一个 JS 对象上实现了 toJSON 方法,那么调用 JSON.stringify 去序列化这个 JS 对象时,JSON.stringify 会把这个对象的 toJSON 方法返回的值作为参数去进行序列化