JSON
曾经,XML是传输结构化数据的标准。后来JSON出现,干掉了他。就是这么一个cool guy,能不学吗? 〒▽〒
JSON是一种数据格式,不是编程语言。因此,并不是只有JS才使用JSON,JSON只是JS语法的一个子集。
一、JSON的语法
JSON的语法可以表示三种类型的值:简单值、对象和数组。
1、简单值
简单值可以是字符串、数值、布尔值和null,但是JSON不支持undefined。
JS表示字符串可以用单引号,也可以用双引号,但是JSON表示字符串只能用双引号,单引号会导致语法错误。
⊙﹏⊙||| 大佬还挑食,唉,没办法,大佬就得宠着啊 ⊙﹏⊙|||
2、对象
JS中对象的字面量创建法的标准格式是这么写的:
var person={ name:'Alice', age:18 };
但是JSON大佬表示一个对象,他要求,对象的属性必须加上双引号,表示字符串的时候也必须用双引号,同时结束的时候不准有分号
{ "name":"Alice", "age":18 }
好吧,JSON虽然事,但是他有一个好处,就是JSON可以在对象中嵌套对象
3、数组
跟JS的数组表达格式一样,但是,把数组和对象结合起来,就会构成更复杂的数据集合了。
[ { "book":"不想学习", "authors":[ "王大锤","王花花" ], "year":"2019" }, { "book":"偶尔也不想活着", "authors":[ "抑郁","没精神" ], "year":"2019" }, ]
二、JSON的解析与序列化
JSON能当大佬的原因是,可以把JSON数据结构解析为有用的JS对象,方法简单。
1、解析
由于JSON是JS语法的一个子集,所以eval()函数就可以解析JSON。
ES5对解析JSON的行为进行了规范,定义了全局对象JSON。该对象有两个方法,stringify()和parse(),前者将JS对象序列化为JSON字符串,后者把JSON字符串解析为原生JS值。
stringify在将对象序列化为字符串的时候,会跳过值为undefined的属性。
var books= [ { "book":"不想学习", "authors":[ "王大锤","王花花" ], "year":"2019" }, { "book":"偶尔也不想活着", "authors":[ "抑郁","没精神" ], "year":"2019" }, ]; var jsonTxt=JSON.stringify(books); console.log("jsonTxt-->"+jsonTxt); //jsonTxt-->[{"book":"不想学习","authors":["王大锤","王花花"],"year":"2019"},{"book":"偶尔也不想活着","authors":["抑郁","没精神"],"year":"2019"}]
parse()方法在把JSON字符串转化为JS值的时候,如果传给JSON.parse()方法的字符串不是有效的JSON,该方法会抛出错误,比如这样:“Unexpected token 单 in JSON at position 0”,这里我故意用单引号包裹一个字符串传给parese()方法,他就给我报错了。
var bookCopy=JSON.parse(jsonTxt); console.log("bookCopy-->"+bookCopy);//bookCopy-->[object Object],[object Object]
三、JSON的序列化stringify()
JSON.stringify()方法可以接收两个参数。第一个参数是过滤器,它的语法可以是数组,也可是是函数。第二个参数是保留缩进的选项,该参数可以是数据,也可以是字符串,但无论是哪个,都不能超过10.保留缩进选项的作用就是:让对象看起来方便,提高可读性。
(1)过滤器参数为数组
当过滤器参数是数组的时候,则JSON.stringify()对象是筛选出数组中指出的属性。
var books= [ { "book":"不想学习", "authors":[ "王大锤","王花花" ], "year":"2019" }, { "book":"偶尔也不想活着", "authors":[ "抑郁","没精神" ], "year":"2019" }, ]; var jsonTxt=JSON.stringify(books,["authors",'year']); console.log("jsonTxt-->"+jsonTxt); //jsonTxt-->[{"authors":["王大锤","王花花"],"year":"2019"},{"authors":["抑郁","没精神"],"year":"2019"}]
(2)过滤器参数为函数
过滤器参数为函数时,该函数会接收两个参数,键名和属性值。这个函数叫做过滤函数(repalcer)。
键名只能是字符串,如果值并非键值对儿结构的值,键名可以是空字符串。
键名用来选择如何处理对象中的属性。
该方法可以用来修改属性的值,如果属性值为undefined,会跳过该属性,所以可以用该方法来删除属性。
var jsonTxt=JSON.stringify(books,function(key,value){ switch(key){ case "authors": return value.join('&'); case "year": return 5000;//修改了year的值 case "edition": return undefined;//通过设置undifined关键字删除该属性 default://default项是必须要提供的项目 return value; } }); console.log("jsonTxt-->"+jsonTxt); //jsonTxt-->[{"book":"不想学习","authors":"王大锤&王花花","year":5000},{"book":"偶尔也不想活着","authors":"抑郁,没精神","year":5000}]
(3)保留缩进选项为数值
数值不能超过10.超过了就按10来算。
(4)保留缩进选项为字符串
字符串长度不能超过10,超过了就按10来算。对象里面的对象,他前面的字符串长度会累加。
var jsonTxt=JSON.stringify(books,function(key,value){ switch(key){ case "authors": return value.join('&'); case "year": return 5000;//修改了year的值 case "edition": return undefined;//通过设置undifined关键字删除该属性 default://default项是必须要提供的项目 return value; } },"--"); console.log("jsonTxt-->"+jsonTxt);
jsonTxt-->[ --{ ----"book": "不想学习", ----"authors": "王大锤&王花花", ----"year": 5000 --}, --{ ----"book": "偶尔也不想活着", ----"authors": "抑郁&没精神", ----"year": 5000 --} ]
对象这样读起来就不是一行了,读起来很方便。
四、解析选项JSON.parse()方法
JSON.parse()方法也可以接收一个参数,该参数是一个函数,在每个键值对儿上调用,这个函数名字叫做还原函数(reviver)。
这个函数也是接收两个参数,一个键,一个值,而且都需要返回一个值。