关于json的那些事

来源:互联网 发布:迷幻p图软件 编辑:程序博客网 时间:2024/06/05 07:01

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模型中的哪一层呢,事实上,他们工作于表示层。