JSON是一个轻量级的数据格式,可以简化表示复杂数据结构的工程量。
JSON使用JavaScript语法的子集表示对象、数组、字符串、数组、布尔值和null。
即使XML也能表示同样复杂的数据结果,但JSON没有那么繁琐,而且在JavaScript中使用更便利。
ECMAScript5定义了一个原生的JSON对象,可以用来将对象序列化微JSON字符串或者将JSON数据解析为JavaScript对象。JSON.stringify()和JSON.parse()方法分别用来实现上述两项功能。这两个方法都有一些选项,通过它们可以改变过滤的方式,或者改变序列化的过程。
原生的JSON对象也得到了很多浏览器的支持,比如IE8+、Firefox3.5+、Safari4+、Opera10.5和Chrome.
/**
* JSON
*/
function cl(x){
console.log(x);
}
/**
* 20.1 语法
*/
//20.1.1 简单值
//JSON字符串与JavaScript字符串的最大区别是:
// JSON字符串必须使用双引号
//20.1.2 对象
//JSON没有声明变量,对象的属性必须加双引号
/*
{
"name":"Jason",
"age":26,
"school":{
"name":"FuDan College",
"location":"ShangHai,China"
}
}
*/
//20.1.3 数组
/*
[{
"name":"Jason",
"age":26,
"school":{"name":"FuDan College", "location":"ShangHai,China"}
}, {
"name":"Alex",
"age":23,
"school":{"name":"FuDan College", "location":"ShangHai,China"}
}
]
*/
/**
* 20.2 解析与序列化
*/
//20.2.1 JSON对象
//JSON对象有两个方法:stringify()和parse()
var book={
title:"JavaScript book",
authors:["Jason Zhou"],
edition:3,
year:2013
};
//将JavaScript对象序列化为JSON字符串
var jsonText1=JSON.stringify(book);
cl(jsonText1);//=>{"title":"JavaScript book","authors":["Jason Zhou"],"edition":3,"year":2013}
//将JSON字符串解析为原生JavaScript值
var bookCopy=JSON.parse(jsonText1);
cl(bookCopy);//=>Object {title: "JavaScript book", authors: Array[1], edition: 3, year: 2013}
//20.2.2 序列化选项
//20.2.2.1 过滤结果
var jsonText2=JSON.stringify(book,["title","edition"]);
cl(jsonText2);//=>{"title":"JavaScript book","edition":3}
var jsonText3=JSON.stringify(book,function(key,value){
switch (key){
case "authors":
return value.join(",");
case "year":
return 5000;
case "edition":
return undefined;
default :
return value;
}
});
cl(jsonText3);//=>{"title":"JavaScript book","authors":"Jason Zhou","year":5000}
//20.2.2.2 字符串缩进
var jsonText4=JSON.stringify(book,null,4);
cl(jsonText4);//=>
/*
{
"title": "JavaScript book",
"authors": [
"Jason Zhou"
],
"edition": 3,
"year": 2013
}
*/
var jsonText5=JSON.stringify(book,null,"--");
cl(jsonText5);//=>
/*
{
--"title": "JavaScript book",
--"authors": [
----"Jason Zhou"
--],
--"edition": 3,
--"year": 2013
}
*/
//20.2.2.3 toJSON()方法
//可以为任何对象添加toJSON()方法
var newBook={
title:"JavaScript book",
authors:["Jason Zhou"],
edition:3,
year:2013,
toJSON:function(){
return this.title;
}
};
var jsonText6=JSON.stringify(newBook);
cl(jsonText6);//=>"JavaScript book"
//另外要注意序列化对象的执行顺序:toJSON->过滤器->序列化->格式化
//20.2.3 解析选项
var newBook2={
title:"JavaScript book",
authors:["Jason Zhou"],
edition:3,
year:2013,
releaseDate:new Date(2013,11,22)
};
var jsonText7=JSON.stringify(newBook2);
var newBook2Copy=JSON.parse(jsonText7,function(key,value){
if(key=="releaseDate"){
return new Date(value);
}else{
return value;
}
});
cl(newBook2Copy.releaseDate.getFullYear()); //=>2013