一、什么是JSON
JSON是一种格式,基于文本,优于轻量,用于交换数据。
二、JSON和JS之间语法区别
对比内容 | json | js |
---|---|---|
属性值 | 只能是数值(10进制),字符串(双引号),布尔值和null,也可以是数组或者是符合JSON类型的对象,不能是函数,NaN,Infinity, -Infinity和undefined | 什么均可 |
逗号问题 | 最后一个属性后面不能有逗号 | 最后一个后面可以是逗号 |
数值 | 前导0不能用,小数点后必须要有数值 | 没有限制 |
三、JSON函数
1、JSON.stringify()
第一个参数(转化的对象)
var obj = {
name: "张三",
age: 20
}
console.log(JSON.stringify(obj))
第二个参数(函数)
var obj = {
"name": "张三",
"age": 20
}
let ret = JSON.stringify(obj, function(key, value) {
if (key === "age") {
return value + 1
}else {
return value
}
})
console.log(ret)
第二个参数(数组)
var obj = {
"name": "张三",
"age": 20
}
let ret = JSON.stringify(obj, ["name"])
console.log(ret) //{"name":"张三"}
第三个参数(数字):用于格式化字符
var obj = {
"name": "张三",
"age": 20
}
let ret = JSON.stringify(obj, null, 2)
console.log(ret)
/*
{
"name": "张三",
"age": 20
}
*/
JSON.stringify()的注意事项:
1、键名没有使用引号,或者键名使用单引号,均被更改为双引号。
2、最后一个属性值后面有逗号,会被去掉。
3、非数组对象的格式化序列,不能保证其属性的顺序。
4、布尔值,数字,字符串的包装对象,在转化过程中会被转化为对应的原始值。
5、undefined,函数,或者是Symbol值出现在数组中,会被转换为null,出现在非数组中,则会被忽略。
JSON.stringify()函数例子。
var obj = {
name:"张三",
age: undefined,
"sayHi": function() {
console.log("大家好")
},
newArr: ["12", null, undefined, Symbol("10"), function asy() {console.log("hh")}],
"sy":Symbol("hhh"),
"dmc":null,
}
console.log(JSON.stringify(obj, null, 2))
//结果:
{
"name": "张三",
"newArr": [
"12",
null,
null,
null,
null
],
"dmc": null
}
如上述例子所示:
age属性被忽略,sayHi函数被忽略,sy属性被忽略,在数组中的undefined变为null, Symobl("10")变为null,asy函数变为null。
JSON.parse()函数
var obj = '{"name":"张三","age":"20","sex":"男","phone":{"home":"1234567","work":["7654321","999000"]}}'
JSON.parse(obj, function(key, value) {
console.log(key, value)
})
第一个参数是需要解析的字符串,第二个参数,是一个函数,在解析过程中可以拿到key和value。
如果第一个参数不合法的话,则报错。在parse解析过程中,本质上,这就是一个深度优先的遍历。
3、Object.toJSON()
var obj = {
name:"张三",
age:20,
toJSON: function() {
return "hhhh"
}
}
console.log(JSON.stringify(obj)) //hhhh
我们在调用JOSN.stringify()函数的时候,其实就是调用对象内部的toJSON()方法,上例子中,存在toJSON方法,则执行toJSON函数,并且返回其值。
Date类型可以直接调用JSON.stringify方法,因为Date内部定义了toJSON方法。
var day = new Date()
console.log(JSON.stringify(day)) //"2022-01-24T07:51:02.947Z"
四、兼容性分析
关于兼容性分析;ie7以及ie7以下的浏览器不支持。所以如果想要进行适配,可以单独引入另一个js文件。