1.什么是JSON
JSON:JavaScript Object Notation,javascript对象表示法;
JSON利用javascript的模式来表示结构化数据,但JSON不从属于javascript,只是一种数据格式,很多语言都有针对JSON的解析器和序列化器
JSON流行的原因
1.和js语法类似,容易理解
2.可以将JSON数据结构解析成有用的js对象
2.JSON语法
JSON的语法可以表示以下三种类型的值:
简单值:字符串、数值、布尔值、null,但不支持js的undefined
对象:表示一组无序的键值对儿
数组:有序的值得列表
JSON不支持变量,函数,对象实例,只是一种表示结构化数据的格式
JSON的对象
{
"name":"wanghuan",
"age":29,
"school":{
"name":"bupt",//虽有两个name,但是在不同对象中不影响
"location":"beijing"
}
}
与js对象字面量的不同:
1.对象属性必须加上””
2.无末尾的分号;
3.没有声明变量(json只是数据结构,没有变量的概念)
JSON的数组
[23,”wanghuan”,true]
与js数组字面量的不同:
1.无声明变量
2.无分号
//数组和对象结合出更复杂的数据集合
[
{
"title":"bupt",
"author":"wanghuan",
"year":2011
},
{
"title":"bupt",
"author":"wanghuan",
"year":2011
},
{
"title":"bupt",
"author":"wanghuan",
"year":2011
}
]
3.序列化
JSON对象的方法:
stringify()
用于把js对象序列化为JSON字符串,默认情况下,此函数输出的JSON字符串不包含任何空格字符或缩进,同时会忽略js对象的函数和原型对象。
参数1:js对象
var book = {
title:"bupt",
author:["wanghuan"],
year:2011
};
var jsonText = JSON.stringify(book);
//{"title":"bupt","author":["wanghuan"],"year":2011}
参数2:过滤器(可以是数组,也可以是函数),可选
var book = {
title:"bupt",
author:["wanghuan"],
year:2011
};
var jsonText = JSON.stringify(book,["title","author"]);
//{"title":"bupt","author":["wanghuan"]}
var book = {
title:"bupt",
author:["wanghuan"],
year:2011,
edition:3
};
var jsonText = JSON.stringify(book,function(key,value) {
switch(key){
case "author":
return value.join(",");//key为数组连接成一个字符串
case "year":
return 5000;
case "edition":
return undefined;//返回undefined删除此属性
default:
return value;//其他值正常显示
}
});
//{"title":"bupt","author":"wanghuan","year":5000}
参数3:字符串缩进(可以是数值等),可选
var book = {
title:"bupt",
author:["wanghuan"],
year:2011
};
var jsonText = JSON.stringify(book,null,4);
//jsonText为,缩进4个空格(自动包含换行符),最大缩进值是10个字符
{
"title":"bupt",
"author":["wanghuan"],
"year":2011
}
toJSON()方法–对过滤器的补充
JSON.stringify()有时不能满足某些对象进行自定义序列化的需求,则给对象定义toJSON()方法
var book = {
title:"bupt",
author:["wanghuan"],
year:2011,
toJSON:function(){
return this.title;
}
};
var jsonText = JSON.stringify(book);
序列化对象的顺序
1.若存在toJSON()方法而且能通过它取得有效的值,则调用这个方法。否则,返回对象本身
2.如果提供了第二个参数,应用此函数过滤器。传入函数过滤器的值是第1步返回的值
3.对第2步返回的每个值进行相应的序列化
4.如果提供了第三个参数,执行相应的格式化
4.解析
parse()
把JSON字符串解析成原生js值
参数1:js对象
var bookCopy = JSON.parse(jsonText);
//book与bookCopy有相同属性,但是没关系的对象
参数2:函数,可选,将在每个键值对上调用
var book = {
title:"bupt",
author:["wanghuan"],
year:2011,
//此属性保存了一个Date对象
releaseDate:new Date(2011,11,1)
};
//Date对象在序列化之后变成了有效的JSON字符串
var jsonText = JSON.stringify(book);
var bookCopy = JSON.parse(jsonText,function(key,value){
//解析在bookCopy中还原了一个Date对象,则bookCopy.releaseDate()属性中会保存一个Date对象
if(key == "releaseDate") {
return new Date(value);
} else {
return value;
}
});
//因为已经是一个Date对象,可以调用getFullYear()
alert(bookCopy.releaseDate.getFullYear());