json是一种轻量级的数据格式,它不是编程语言,更不从属于JavaScriopt。
json用法
1.与JavaScriopt不同的是,json字符串必须使用双引号,否则会报错;
2.json的对象中的属性需要用引号包裹;
3.json不需要声明变量,因为json并不支持变量;
4.json的对象中,键值对与键值对之间用逗号分隔,而不是分号。
数据类型
json可支持三种数据类型:
- 简单值:字符串类型、数字类型、布尔值、null;
- 数组:数组可以通过值的索引来访问值。数组的值可以是任意类型(简单值、数组或对象);
- 对象:对象由键值对构成,每个键值对的值可以是任意类型(简单值、数组或对象)。
注:json不支持undefined、变量、函数或对象实例
序列化与解析
json对象有两个方法:stringify ( )与parse ( ) 。stringify ( )用于将js对象序列化为json字符串,而parse ( ) 用于将json字符串解析为js值。
举个例子:
var book = {
title : "Professional JavaScriopt",
authors : ["Nicholas C. Zakas"],
edition : 3,
year : 2011
};<!--js对象-->
var jsonText = JSON.stringify (book);
<!--jsonText中保存的字符串是
{ "title" : "Professional JavaScriopt" , "authors" : ["Nicholas C. Zakas"] , "edition" : 3 , "year" : 2011}-->
var bookCopy = JSON.parse (jsonText);
上例中,虽然book与bookCopy 具有相同的值,但它们两个是彼此独立的对象。
JSON.stringify ( )
JSON.stringify ( )方法可接收三个参数:
- 需要序列化的js对象;
- 过滤器,可以是数组或函数;
- 用于序列化为json字符串时的缩进(默认情况下,JSON.stringify ( )输出的字符串不包括任何空字符串或缩进 )。
第二个参数为数组
举个例子:
var book = {
title : "Professional JavaScriopt",
aurhors : ["Nicholas C. Zakas"],
edition : 3,
year : 2011
};<!--js对象-->
var jsonText = JSON.stringify (book , ["authors" , "year"]);
<!--jsonText中保存的字符串是
{ "authors" : ["Nicholas C. Zakas"] , "year" : 2011}-->
第二个参数为函数
当stringify ( )方法的第二个参数传入的是一个函数时,该函数会接收两个参数:属性名(键名)、属性值,并返回一个值。
注:若某个键值对的值是undefined,则该属性将会被忽略,不会被序列化。
举个栗子:
var book = {
title : "Professional JavaScriopt",
aurhors : ["Nicholas C. Zakas"],
edition : 3,
year : 2011
};<!--js对象-->
var jsonText = JSON.stringify (book ,function(key , value){
switch(key){
case "authors" :
return value.join(",");
case "year" :
return 5000;
case "edition " :
return undefined;
default :
return value;
}
});
<!--jsonText 保存的json字符串为:
{ "title" : "Professional JavaScriopt" , "authors" : ["Nicholas C. Zakas"] , "year" : 2011}-->
第三个参数
该参数用于控制json字符串中的缩进和空白符。
- 若参数是一个小于等于10的数字(最大缩进空格数为10,大于10的值将会被自动转换为10),则表示每级缩进的空格数;
- 若参数是一个字符串、制表符等的非数值,则该字符串、制表符等将被用作缩进符,同样,字符串等不能超过10个字符。
toJSON ( )方法
举个栗子:
var book = {
title : "Professional JavaScriopt",
aurhors : ["Nicholas C. Zakas"],
edition : 3,
year : 2011,
toJSON:function(){
return this.title;
}
};
var jsonText = JSON.stringify (book);
<!--jsonText保存的字符串为:
"Professional JavaScriopt"-->
序列化的顺序
当把一个js对象传入JSON.stringify ( )时,序列化该对象的顺序则是:
1.若存在toJSON ( )方法且能取得有效值,则调用该方法。否则,返回对象本身;例如:
var book = {
title : "Professional JavaScriopt",
authors : ["Nicholas C. Zakas"],
edition : 3,
year : 2011
};<!--js对象-->
var jsonText = JSON.stringify (book);
<!--当js对象中并不存在toJSON ( )方法或无法取得有效值(值为undefined等情况)时,这一步返回的就是book对象-->
2.如果提供了第二个参数,则应用该过滤器。注:传入过滤器的值是第1步返回的值
3.对第2步返回的每个值进行相应的序列化。
4.如果提供了第三个参数,则执行。
JSON.parse ( )
JSON.parse ( )可以接收两个参数:
- 需要解析的json字符串;
- 还原函数;
还原函数同过滤函数一样,可以接收两个参数:key、value,并返回一个值。若返回的是undefined,则表示要从结果中删除相对应的键。
举个栗子:
var book = {
title : "Professional JavaScriopt",
authors : ["Nicholas C. Zakas"],
edition : 3,
year : 2011,
releaseDate : new Date(2018,12,12)
};
var jsonText = JSON.stringify (book);
var bookCopy=JSON.parse(jsonText,function(key,value){
if(key=="releaseDate"){
return new Date(value);
}else{
return value;
}
});
alert(bookCopy.releaseDate.getFullYear());