JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。
轻量级:相比于同样被广泛使用的数据交换格式xml要少很多标签
- 什么是数据交换?
以前端JS进行ajax的POST请求为例,后端PHP处理请求为例:
- 前端构造一个JS对象,用于包装要传递的数据,然后将JS对象转化为JSON字符串,再发送请求到后端;
- 后端PHP接收到这个JSON字符串,将JSON字符串转化为PHP对象,然后处理请求。
- JSON 文件的文件类型是 “.json”
- JSON 文本的 MIME 类型是 “application/json”
相对于JS对象,JSON的格式更严格
对比内容 | JSON | JS对象 |
键名 | 必须是加双引号 | 可允许不加、加单引号、加双引号 |
属性值 | 只能是数值(10进制)、字符串(双引号)、布尔值和null,也可以是数组或者符合JSON要求的对象,不能是函数、NaN, Infinity, -Infinity和undefined | 没限制 |
逗号问题 | 最后一个属性后面不能有逗号 | 可以 |
数值 | 前导0不能用,小数点后必须有数字 | 没限制 |
应用
JavaScript对象 (转换为)→ JSON字符串
JSON.stringify()
示例:
let b=[1,2] JSON.stringify(b) // "[1,2]"
JSON字符串 (解析为)→ JavaScript对象
JSON.parse()
示例:
JSON.parse('[1, 5, "false"]'); // [1, 5, "false"]
原理
JavaScript 程序会使用内建的 eval() 函数,用 JSON 数据来生成原生的 JavaScript 对象。
如果一个JS对象上实现了toJSON
方法,那么调用JSON.stringify
去序列化这个JS对象时,
JSON.stringify
会把这个对象的toJSON
方法返回的值作为参数去进行序列化。
var info={ "msg":"I Love You", "toJSON":function(){ var replaceMsg=new Object(); replaceMsg["msg"]="Go Die"; return replaceMsg; } }; JSON.stringify(info); //出si了,返回的是:'"{"msg":"Go Die"}"',说好的忽略函数呢
Date
类型可以直接传给JSON.stringify
做参数,其中的道理就是,Date
类型内置了toJSON
方法。