json(全称:JavaScript Object Notation)
语法:
json可以表示下列三种类型的值:
简单值:可以在json中表示字符串,数值,布尔值,null,但不支持undefined;
一个值得注意的地方就是在json中表示字符串需要用双引号,用单引号则会导致报错,如应该用“helloworld”表示而不应该用‘helloworld’;
对象:
格式大概如下:
{
"name":"XiaoMing",
"age":22,
"school":{
"name":"SCNU",
"location":"GuangZhou"
}
}
可以看出具有如下几个特点:
1. 属性名必须添加双引号;
2. 结束时不需要添加分号;
3. 属性值可以是普通值也可以是复杂类型值,当为字符串时添加双引号,当为数值时则不用;
数组:
格式:[25,”hi”,true];
综上所述,我们其实可以这样表示一个json:
{
"name":"XiaoMing",
"age":22,
"school":{
"name":"SCNU",
"location":"GuangZhou"
},
"parent":["XiaoPeng","XiaoHong"]
}
与XML相比好在哪里?
我们知道,Web服务的第一次浪潮是有XML引起的,但XML的繁琐,冗长也引起了越来越多人的不满,在这个基础上,json诞生了。
json与XML相比,他可以直接把值传给eval();而且不用创建DOM对象,(XML的做法则是解析成DOM文档,读取时则是操作DOM节点)而频繁对DOM对象的操作,事实上正是网页性能的浪费所在,现代的web技术,优化的方向之一便是如何减少对DOM对象的操作;
这里我们要注意一点,json与XML都是一种数据格式,除了应用于Web,大部分的语言都提供了json与XML的解析器与序列化器。
Json的解析与序列化
其实无非两个方法:
JSON.stringify()与JSON.parse()
JSON.stringify():即把Javascript对象序列化为JSON字符串;
JSON.parse():即把JSON字符串解析为原生Javascript对象;
JSON.stringify()方法详解:
如下所示:
var xueji=
{
name:"XiaoMing",
age:22,
school:{
"name":"SCNU",
"location":"GuangZhou"
},
parent:["XiaoPeng","XiaoHong"]
}
var jsonText=JSON.stringify(xueji);
事实上,这个只是转化为json字符串的普通用法,JSON.stringify()除了接受第一个参数,即要解析的javascript对象,还可以再接收两个参数,即过滤器参数与缩进参数
过滤器参数简单用法之一:
var xueji=
{
name:"XiaoMing",
age:22,
school:{
"name":"SCNU",
"location":"GuangZhou"
},
parent:["XiaoPeng","XiaoHong"]
}
var jsonText=JSON.stringify(xueji,["name","age"]);
此时的返回结果中,接json字符串只会有
{
"name":"XiaoMing",
"age":22,
}
即选中name与age属性做json处理
过滤器参数简单用法之二:
var xueji=
{
name:"XiaoMing",
age:22,
school:{
"name":"SCNU",
"location":"GuangZhou"
},
parent:["XiaoPeng","XiaoHong"],
job:undefined
}
此时的job职位在json中将不会得到返回,也就是说,json仍然为:
{
"name":"XiaoMing",
"age":22,
"school":{
"name":"SCNU",
"location":"GuangZhou"
},
"parent":["XiaoPeng","XiaoHong"],
}
也就是说,过滤器参数如果捕获到所对应的值为undefined,那么该值在json中将不会得到体现,原因很简单,应为json不支持undefined格式;
因此我们可以利用这个特性,做一些过滤函数处理,得到我们想要的,在不想要的属性上,返回一个undefined,除去该属性与值,
用法如下所示:
ar xueji=
{
name:"XiaoMing",
age:22,
school:{
"name":"SCNU",
"location":"GuangZhou"
},
parent:["XiaoPeng","XiaoHong"],
}
var jsonText=JSON.stringify(xueji,function(key,value){
switch(key){
case "name" return value
case "age" return value
case "school" return undefined //过滤掉学校
case "parent" return return value.join(",")//将数组转换为字符串
default return value //为了程序的健壮性,应该提供default选项
});
此时,将得到json如下:
{
"name":"XiaoMing",
"age":22,
"parent":"XiaoPeng","XiaoHong",
}
缩进参数用法:
用来调返回json的格式
var xueji=
{
name:"XiaoMing",
age:22,
school:{
"name":"SCNU",
"location":"GuangZhou"
},
parent:["XiaoPeng","XiaoHong"]
}
var jsonText=JSON.stringify(xueji,["name","age"],4);
即表示表格级别缩进4格
如果写成var jsonText=JSON.stringify(xueji,["name","age"],"--");
这个时候将会得到有趣的json格式,如下所示:
{
--"name":"XiaoMing",
--"age":22,
}
有时候,上述的方法还不够满足我们对json返回处理的要求,此时,我们还可以再用toJSON()方法做下一步处理:
如:
var xueji=
{
name:"XiaoMing",
age:22,
school:{
"name":"SCNU",
"location":"GuangZhou"
},
parent:["XiaoPeng","XiaoHong"]
toJSON:function(){
return this.name+this.age
}
}
var jsonText=JSON.stringify(xueji)
如果使用到了toJSON()方法,需要注意:
1. 当 toJSON()返回undefined时,如果位于顶级对象中,则值仍为undefined,如果位于非顶级对象中,则会将值变为null;
2. 使用toJSON()方法,需要注意一个顺序的问题:
执行顺序为:
a.执行toJSON()方法,将值传给过滤器参数,
b.执行过滤器,进行相应序列化,
c.进行格式化(即缩进等操作)
JSON.parse()方法详解:
JSON.parse()方法即将json转化为javascript对象,除了普通的第一擦描述,传入json字面量之外,还提供与过滤器方法用法类似的还原方法:
可看例子:
var xueji=
{
name:"XiaoMing",
age:22,
school:{
"name":"SCNU",
"location":"GuangZhou"
},
parent:["XiaoPeng","XiaoHong"],
time: new Date(2017,7,22)
}
var jsonText=JSON.stringify(xueji);
//将javascript还原:
var javascriptText=JSON.parse(jsonText,function(key,value){
if(key==time){
return new Date(value);
}
else{
return value;
}
});
(值得注意的是,JSON.parse()解析不出有效的JSON将抛出错误)
后记
值得一提的是,我们知道,计算机传输中只能传输0与1,那么像JSON与XML这样的数据格式,将会作用于OSI模型中的哪一层呢,事实上,他们工作于表示层。