要点:
- JSON,一种数据格式,不是一种编程语言
- 并不只是JavaScript才使用JSON,很多编程语言都有针对JSON的解析器和序列化器
- JSON,可以直接传给eval() ,不必创建DOM对象
- JSON,可以表示一下三种类型的值:简单值(字符串、数值、布尔值、null,注意没有undefined)、对象、数组
- JSON字符串必须使用双引号
- JSON不支持变量、函数、对象实例
- JSON对象有两个方法:stringify()和parse(),分别用于把JavaScript对象序列化为JSON字符串,把JSON字符串解析为原生的Javascript值。
- 直接使用JSON.stringify() 输出的JSON字符串不包含任何空格字符或者缩进
- 在序列化JavaScript对象时,所有函数、原型成员、值为undefined的任何属性都会被忽略
- JSON.stringify()还可以另外接收两个参数,一个是过滤器,可以是数组也可以是函数;另一个可表示JSON中是否保留缩进
- toJSON方法,作为函数过滤器的补充
- 传给JSON.parse()的字符串如果不是有效的JSON,该方法会抛出错误
- JSON.parse() 方法也可以接收另一个参数,该参数是一个函数(还原函数)
stringify序列化(JavaScript对象):
例1. 数组过滤器+结果缩进4个空格
var book = {
"title": "JS",
"authors": [
"小红",
"小明"
],
"edition": 4,
"year": 2018
}
var jsonText = JSON.stringify(book, ["title", "edition"]);
console.log(jsonText);
结果:
{
"title": "JS",
"edition": 4
}
例2. 函数过滤器,默认没有缩进
var book = {
"title": "JS",
"authors": [
"小红",
"小明"
],
"edition": 4,
"year": 2018
}
var jsonText = JSON.stringify(book, function(key, value){
switch (key){
case "author":
return value.join(",");
break;
case "year":
return 5000;
break;
case "edition":
return undefined;
break;
default:
return value;
}
});
console.log(jsonText);
结果:{"title":"JS","authors":["小红","小明"],"year":5000}
例3. toJSON
var book = {
"title": "JS",
"authors": [
"小红",
"小明"
],
"edition": 4,
"year": 2018,
toJSON: function () {
return this.title;
}
}
var jsonText = JSON.stringify(book);
console.log(jsonText);
结果:"JS"
toJSON()可以作为函数过滤器的补充,因此理解序列化的内部顺序十分重要。假设把一个对象传入 JSON.stringify(),序列化该对象的顺序如下。
(1) 如果存在 toJSON()方法而且能通过它取得有效的值,则调用该方法。否则,返回对象本身。
(2) 如果提供了第二个参数,应用这个函数过滤器。传入函数过滤器的值是第(1)步返回的值。
(3) 对第(2)步返回的每个值进行相应的序列化。
(4) 如果提供了第三个参数,执行相应的格式化。
parse解析:
例4. 还原函数
var book = {
"title": "JS",
"authors": [
"小红",
"小明"
],
"edition": 4,
"year": 2018,
releaseDate: new Date(1999,11,1)
};
var jsonText = JSON.stringify(book);
console.log(jsonText);
var bookCopy = JSON.parse(jsonText, function (key,value) {
if(key=="releaseDate"){
return new Date(value);
} else{
return value;
}
})
console.log(bookCopy);
结果:
{"title":"JS","authors":["小红","小明"],"edition":4,"year":2018,"releaseDate":"1999-11-30T16:00:00.000Z"}
{title: "JS", authors: Array(2), edition: 4, year: 2018, releaseDate: Wed Dec 01 1999 00:00:00 GMT+0800 (中国标准时间)}
如果没有还原函数:
var book = {
"title": "JS",
"authors": [
"小红",
"小明"
],
"edition": 4,
"year": 2018,
releaseDate: new Date(1999,11,1)
};
var jsonText = JSON.stringify(book);
console.log(jsonText);
var bookCopy = JSON.parse(jsonText);
console.log(bookCopy);
结果:
{"title":"JS","authors":["小红","小明"],"edition":4,"year":2018,"releaseDate":"1999-11-30T16:00:00.000Z"}
{title: "JS", authors: Array(2), edition: 4, year: 2018, releaseDate: "1999-11-30T16:00:00.000Z"}