JSON是一种数据格式
1.JSON 语法:
JSON语法可以表示为三种类型的值:
1.简单值:可以在JSON中表示字符串、数组、布尔值、null,没有undefined,在JSON中如果有undefined值,该属性会被删除。
10
"aaaa"
2.对象:表示的是一组无序的键值对儿。每个键值对儿中的值可以是简单值,也可以是复杂数据类型的值。
1 { 2 "name":"ccc", 3 "age":20, 4 "sex":"man"
"school":{
"name":"henan",
"location":"PingDingShan"
} 5 }
ps1:JSON对象没有声明变量;
ps2.:JSON对象的属性必须加" ",属性的值可以是简单值,也可以是复杂类型值。
3.数组
JSON数组采用的JavaScript中的数组字面量形式。
["20","cc",true]
把数组和对象结合起来,可以构成更复杂的数据集合:
[
[
{title:"第一课"},
{url:"all_input.html",title:"全选,反选,不选"},
{url:"select_add.html",title:"下拉框"},
{url:"outline.html",title:"外边框"}
],
[
{title:"第二课"},
{url:"border-radius.html",title:"css3圆角"},
{url:"cd.html",title:"出仓的光盘"},
{url:"cube.html",title:"立方体"}
],
[
{title:"第三课"},
{url:"canvas5.html",title:"刷新一下马赛克"},
{url:"canvas6.html",title:"碰壁的小方框"},
{url:"balls/canvas7.html",title:"自由活动的小球"}
],
[
{title:"第四课"},
{url:"localstorage.html",title:"记录数据"},
{url:"cleardate.html",title:"清除本地数据"},
{url:"linear.html",title:"渐变背景"}
],
[
{title:"第五课"},
{url:"photos.html",title:"图片回收站"},
{url:"shoppingCar.html",title:"商品购物车"},
{url:"skin.html",title:"背景换肤"}
]
]
2.JSON解析和序列化
JSON对象有两个方法:stringify()和parse(),分别由于把JavaScript对象序列化为JSON字符串和把JSON字符串解析为JavaScript值。
var book = {
title:"Professional javascript",
authors:["Nicholas C.Zakas"],
edition:4,
year:2015
};
var jsonText = JSON.stringify(book);
console.log(jsonText); // 输出json格式:{"title":"Professional javascript","authors":["Nicholas C.Zakas"],"edition":4,"year":2015}
var bookCopy = JSON.parse(jsonText);
console.log(bookCopy); //输出JavaScript格式: {title: "Professional javascript", authors: Array[1], edition: 4, year: 2015}
1.序列化选项:stringify()
JSON.stringify()除了要序列化的JavaScript对象外,还可以接受另外两个参数,这个参数用于只指定以不同的方式序列化JavaScript对象。第一参数是个过滤器,可以是一个数组,也可以是一个函数;第二个参数是一个选项,表示是否在JSON字符串中保留缩进。
var book = {
title:"Professional javascript",
authors:["Nicholas C.Zakas"],
edition:4,
year:2015
};
var jsonText = JSON.stringify(book,["title","edition"]);
console.log(jsonText); // 输出{"title":"Professional javascript","edition":4}
输出book中含有数组的属性,其余不输出。
第二参数是函数。传入的函数接收两个参数,属性名和属性值。根据属性名可以知道应该如何处理要序列化的对象中的属性。属性中只能是字符串。为了改变序列化对象的结果,函数返回的值就是相应键的值。如果函数返回了undefined,相应的属性会删除,不显示。
var jsonText02 = JSON.stringify(book,function(key,value) { switch(key){ case"authors": return value.join(",") case"year": return 2016 case"edition": return undefined; default: return value; } }); console.log(jsonText02); //输出:{"title":"Professional javascript","authors":"Nicholas C.Zakas","year":2016}
输出值中没有edition属性
2.每个属性换行缩进
JSON.stringify()的第三个参数用于控制结果中的缩进和空白符,如果该参数是一个数值,它表示每个属性分别缩进的空格数,最大缩进空格数为10,若大于10的值都会自动转换为0.
如果缩进参数是一个字符串不是数字,那么字符串可以设置为制表符。
var jsonText03 = JSON.stringify(book,null,4); console.log(jsonText03);
//输出结果:{ "title": "Professional javascript", "authors": [ "Nicholas C.Zakas" ], "edition": 4, "year": 2015 }
var jsonText03 = JSON.stringify(book,null,"--");
console.log(jsonText03);
/*
{
--"title": "Professional javascript",
--"authors": [
----"Nicholas C.Zakas"
--],
--"edition": 4,
--"year": 2015
}
*/
3.toJSON()方法
有时,JSON.stringify()还是不能满足对某些对象进行自定义序列化的需求。这时可以给对象定义toJSON()方法,返回其自身的JSON()数据格式。
var book2 = {
"title":"Professional javascript",
"authors":["Nicholas C.Zakas"],
edition:4,
year:2015,
toJSON:function(){
return this.title;
}
}; -->var book2 = {"Professional javascript"}
var jsonText04 = JSON.stringify(book2);
console.log(jsonText04); //输出:"Professional javascript"
一个对象传入JSON.stringify(),序列化该对象如下:
(1)如果存在toJSON()方法而且能通过它取得有效的值,则调用该方法。否则,返回对象本身。
(2)如果提供了第二个参数,应用这个函数过滤器。传入函数过滤器的值是第(1)步返回的值。
(3)对第(2)步返回的每个值进行相应的序列化。
(4)如果提供了第三个参数,执行相应的格式化。
3.解析选项
JSON.stringify()方法也可以接收另一个参数,该参数是一个函数,将在每个键值对儿上调用。该函数被称为还原函数(reviver),如果还原函数返回undefined,则表示要从结果中删除相应的键。如果返回其他值,则将该值插入到结果中。
var book3 = {
"title":"Professional javascript",
authors:["Nicholas C.Zakas"],
edition:4,
releaseDate:new Date(2015, 11, 1) -->解析过执行,此时的属性值为函数的返回值。
};
var jsonText05 = JSON.stringify(book3);
var bookCopy05= JSON.parse(jsonText05,function (key,value) {
if (key == "releaseDate") {
return new Date(value);
}else{
return value;
}
});
console.log(bookCopy05.releaseDate.getFullYear()); //输出:2015