这是我参与2022首次更文挑战的第3天,活动详情查看:2022首次更文挑战
JSON是一种轻量级的数据交换格式。
使用场景:
- 网络数据的传输
- 项目的配置文件
- 非关系型数据库(NoSQL)将json作为存储格式。
json顶层的数据类型
- 简单值:Number ,string(必须是双引号),Boolean ,null
- 对象:key和value,key必须是字符串,必须是双引号包裹,value可以是简单值,对象值,数组值
- 数组值:数组值中可以是简单值,对象值,数组值
JSON序列化
因为有时我们需要JSON格式的字符串,所以我们需要有转换方法,来实现格式的转化。
JSON.stringifg() 方法可以将javascript的数据类型,转为json格式的数据。
传入三个参数:
-
转换的对象
-
replacer (过滤对象相应的键)
- replacer数组时,只会将数组中传入的key进行转化
- replacer函数时,可以对value的值进行处理后返回。
-
space :表示每一级缩进的字符数,默认是空格,最大值为10,大于10会自动设置为10。
也可以设置为其他字符,如tab或者--,最大的设置量也是10个。
let obj = {
name: "fea",
age: 12,
friend: {
name: "litao",
address: "北京市",
},
};
//1.repalcer为数组
// let jsonString = JSON.stringify(obj, ["name", "age"]);
//2.repalcer为函数
let jsonString = JSON.stringify(
obj,
(key, value) => {
if (key == "age") {
return value + 1;
}
//除了key为age时进行处理,其他的还返回默认值
return value;
},
4
//或者使用 '--'
);
JSON.parse() 将json格式的数据转为javascript的数据类型。例如讲一个json格式的字符串对象转为js中真正的对象。
传入的参数:
- 需要转换的json对象
- reviver 函数,用于在返回之前对处理返回的值。
let parseStr = JSON.parse(getobj, (key, value) => {
if (key === "age") {
return value - 1;
}
return value;
});
toJSON():我们可以自定义要序列化的属性,可以在要序列化的对象上实现toJSON()方法,那么当我们使用JSON.stringfy()方法时,就会按toJSON()返回的对象进行处理。
let obj = {
name: "fea",
age: 12,
friend: {
name: "litao",
address: "北京市",
},
toJSON() {
return {
name: this.name,
age: this.age,
};
},
};
let jsonString = JSON.stringify(
obj,
(key, value) => {
if (key == "age") {
return value + 1;
}
//除了key为age时进行处理,其他的还返回默认值
return value;
},
4
//或者使用 '--'
);
console.log(jsonString);
/*{
"name": "fea",
"age": 13
}*/
注意:toJSON()不能使用箭头函数。
JSON.stringfy()的执行步骤
- 如果对象中有实现了toJSON()方法,则处理toJSON()方法返回的值。否则默认处理整个对象。
- 如果传入了第二个参数,则对第一步返回的值进行过滤处理。
- 对过滤后的值进行序列化。
- 如果提供了第三个参数,则进行相应的缩进。