1 JSON的特点
JSON是一个轻量级的数据格式,可以简化表示复杂数据结构的工作量。
2 JSON和JS的语法差别
1⃣️JSON语法可以表示三类值:简单值,对象,数组。
JS和JSON,字符串区别是JSON里的字符串必须用双引号,用单引号会有语法错误。
2⃣️JSON对象和JS对象字面量的不同: 1.没有声明变量 2.没有末尾的分号
JS对象字面量的标准方式:
var person = {
name: "song",
age:18
};
也可以这样:
var person = {
"name": "song",
"age": 18
};
JSON表示对象的方法如下:
{
"name": "song",
"age": 18
}
这里补充一条:
json表示数组的方法: { "author":[ "age", 25, true]}
3 JSON的序列化
json.stringify()除了要序列化的js对象外,还可以接受两个参数。
☝️ 第一个参数的作用是过滤,参数可以是数组,也可以是函数;
☝️ 第二个参数是一个选项,表示是否在json字符串中保留缩紧。
单独或组合使用这两个参数,可以更全面深入地控制json的序列化。
过滤结果
如果过滤器是数组,则结果中只包含数组中列出来的属性,例:
var book = {
"title" : "hello",
"author" : ["song"],
"edition" : 3,
"year" : 2011
};
var jsonText = JSON.stringify(book,["title","edition"]);
运行结果:
jsonText={
title:"hello",
edition:3
};
如果过滤器是函数,传入的函数需要接收两个参数,分别是属性名和属性值,根据属性名可以知道应该如何处理要序列化的对象的属性。例:
var book = {
"title" : "hello",
"author" : ["song"],
"edition" : 3,
"year" : 2011
};
var jsonText = JSON.stringify(book,function(key, value){
switch(key) {
case "author":
return value.json(",");
case "year":
return 5000;
case "edition":
return undefined;
default:
return value;
}
})
这里,函数过滤器根据传入的值来决定,如果键是“authors”,就将数组连接为一个字符串;如果键为“year”,则将其值设为5000;如果键为“edition”,通过返回“undefined”删除该属性。
⚠️ 最后一定要提供default项。
总结:
如果把一个对象传进JSON.stringify(),序列化该对象的顺序如下:
1⃣️ 如果存在toJSON()方法,而且能通过他取得有效的值,则调用该方法,否则,返回对象本身。
2⃣️ 如果提供了第二个参数,应用这个函数过滤器,传入函数过滤器的值是1⃣️返回的值。
3⃣️ 对2⃣️返回的每个值进行相应的序列化。
4⃣️ 如果提供了第三个参数,执行相应的格式化。
4 JSON的解析
JSON.parse()方法也可以接收另一个参数,该参数是一个函数,将在每个键值对上调用,这个函数被称为还原函数。例:
var book = {
"title" : "hello",
"author" : ["song"],
"edition" : 3,
"year" : 2011,
releaseDate : new Date(2011,11,1)
};
var jsonText = JSON.stringify(book);
var bookCopy = JSON.parse(jsonText, function(key, value){
if(key == "releaseDate"){
return new Date(value);
}else{
return value;
}
});