JSON使用介绍

来源:互联网 发布:淘宝商城卖什么赚钱 编辑:程序博客网 时间:2024/06/10 02:30

JSON: JavaScript Object Notation(JavaScript 对象表示法),是一种轻量级的文本数据交换格式,而不是一种编程语言。JSON 文本格式在语法上与创建 JavaScript 对象的代码相同,因此无需解析器。当然,并不是只有JavaScript能使用JSON,毕竟它只是一种数据交换格式,其他的编程语言都有针对JSON的解析器和序列化器。

1、 JSON 语法

JSON的语法与JavaScript语法比较相似,可以简单概括如下:

  • 数据在名称/值对中,如“属性名”:“值”(JSON中的属性名必须用双引号,而不能省略或者用单引号代替)
  • 数据由逗号分隔,如“属性名1”:“值1”,“属性名2”:“值2”
  • 花括号保存对象,如 {“属性名1”:“值1”,“属性名2”:“值2”}
  • 方括号保存数组,如 [ {“属性名1”:“值1”,“属性名2”:“值2”}, {“属性名1”:“值1”,“属性名2”:“值2”} ]
  • 元素值可具有的类型:字符串、数值、布尔值、对象、数组、以及 null,但是JSON不支持JavaScript中的undefined。

1.1、 JSON对象

JSON对象与JavaScript中的对象表示方法有所不同:
JavaScript对象:

var person = {        name : "sean",        sex : "male"    };

JSON表示上述对象的方式如下:

    {        "name" : "sean",        "sex" : "male"    }

通过比较发现两者还是有一些区别的:JSON中不用申明变量,也没有变量的概念,结尾处不需要分号,另外就是JSON中对象的属性必须用双引号。

1.2、 JSON数组

如果要表示多个上述的对象,则要用到数组,表示方法如下:

    [        {            "name" : "sean",            "sex" : "male"        },        {            "name" : "jack",            "sex" : "male"        },        {            "name" : "mary",            "sex" : "female"        }    ]

通过把数组和对象结合起来,就可以构成更复杂的数据集合。

2、 JavaScript中JSON的序列化与解析

JSON对象有两个方法:stringify()和parse(),这两个方法分别用于把JavaScript对象序列化为JSON字符串和把JSON字符串解析为原生的JavaScript值。

2.1、 stringify()序列化

var person = {        name : "sean",        sex : "male",        school : {            name: "SE University",            location : "Nanjing"        },        };    var jsonText = JSON.stringify(person);    alert(typeof jsonText);    alert(jsonText);    

上述代码通过JSON的stringify()方法将JavaScript对象序列化为JSON字符串,并将其存放在jsonText对象中,保存在jsonText中的字符串如下所示:

{"name":"sean","sex":"male","school":{"name":"SE University","location":"Nanjing"}}

但是当我们不需要对JavaScript对象中的所有属性都序列化时,就需要用到过滤参数。除了JavaScript对象外,JSON.stringify()可以接收另外两个参数,第二个参数是一个过滤器,可以是一个数组,也可以是一个函数(也称为过滤函数);第三个参数是一个表示JSON字符串中是否保留缩进。

var person = {        name : "sean",        sex : "male",        school : {            name: "SE University",            location : "Nanjing"        },        };    var jsonText = JSON.stringify(person,["name","sex"],4);    alert(typeof jsonText);    console.log(jsonText);

第二个参数是一个数组,数组中列出了两个属性会被序列化,而其他的属性则会被过滤掉,因此序列化结果中只剩下”name”和”school”两个属性。第三个参数是4,表示每个级别缩进的空格数,需要注意的是最大空格数为10,所以大于10的数都会自动转化为10.因此最终jsonText中保存的字符串为:

{    "name": "sean",    "sex": "male"}

如果在对JavaScript对象进行序列化的过程中,不仅对其进行属性的过滤,同时需要改变其属性值,则第二个参数需要用到函数。该函数接收两个参数:属性名和属性值,根据属性值可以确定需要处理地哪些属性,而相应的函数返回值则是对应的属性值,如果不需要某个属性,则只需要返回undefined。

    var person = {        name : "sean",        sex : "male",        school : {            name: "SE University",            location : "Nanjing"        },        };    var jsonText = JSON.stringify(person,function(key, value){        switch(key){            case "name":                return "jack";            case "sex":                return undefined;            default:            return value;        }    });    console.log(jsonText);

这里,函数根据传过来的属性名来决定返回的属性值。如果属性名为”name”,则将其值设置为”jack”,如果属性名为”sex”,则返回undefined删除该属性,最后一定要提供default项以便正确返回其他的属性值。上述结果为:

{"name":"jack","school":{"name":"jack","location":"Nanjing"}}

有时候,JSON.stringify()还是不能满足对某些对象进行自定义序列化的需求。在这种情况下可以给对象定义toJSON()方法,返回其自身的JSON数据格式。

var person = {        name : "sean",        sex : "male",        school : {            name: "SE University",            location : "Nanjing"        },        toJSON : function(){ return this.school; }        };        var jsonText = JSON.stringify(person);        console.log(jsonText);

结果为:

{"name":"SE University","location":"Nanjing"}

这里我们只需要注意序列化的顺序:

  • 如果存在toJSON()方法而且能通过它取得有效的值,则调用该方法。否则,按默认顺序执行序列化。
  • 如果提供了第二个参数,应用这个函数过滤器。传入函数过滤器的值是第(1)步返回的值。
  • 对第(2)步返回的每个值进行相应的序列化。
  • 如果提供了第三个参数,执行相应的格式化。

2.2、 parse()解析

将JSON字符串传递给JSON.parse()就可以得到相应的JavaScript值,例如:

    var person = {        name : "sean",        sex : "male",        school : {            name: "SE University",            location : "Nanjing"        }        };        console.log(person);        var jsonText = JSON.stringify(person);        console.log(jsonText);        var personCopy = JSON.parse(jsonText);        console.log(personCopy);

得到一个与person具有相同属性的personCopy对象,虽然两者属性相同,但是是两个独立的对象,没有任何关系。结果如下:

这里写图片描述

JSON.parse()除了JavaScript对象外,还接收另外一个参数,该参数是一个函数,为了与过滤函数区别,称为还原函数,但是两者的使用方法基本相同。例如我们在将日期字符串转换成Date对象时,就经常用到还原函数,如下:

var person = {        name : "sean",        sex : "male",        school : {            name: "SE University",            location : "Nanjing"        },        releaseDate: new Date(2016,6,12)        };        console.log(person);        var jsonText = JSON.stringify(person);        console.log(jsonText);        var personCopy = JSON.parse(jsonText,function(key,value){            if(key=="releaseDate"){                return new Date(value);            }else{                return value;            }        });        console.log(personCopy);

上述代码在JavaScript对象中增加了一个”releaseDate”属性,保存着一个Date对象,这个对象经过序列化之后转换成了一个JSON字符串。在解析的时候,通过判断如果属性是”releaseDate”,则基于相应的属性值创造一个Date对象。通过以下结果可以看出来对象与字符串之间的转换。

这里写图片描述

3、 PHP中使用JSON

很多时候在进行前后端交互时,后台程序使用的是PHP,PHP中也同样可以使用JSON。PHP通过json_encode() 对变量进行 JSON 编码,该函数如果执行成功返回 JSON 字符串数据,否则返回 FALSE 。

<?php    $person=array('name' => 'sean' , 'sex'=>'male', 'school'=>array('name'=>'SE university', 'location'=>'Nanjing'));    $json = json_encode($person);    echo $json;?>

得到结果为:

{"name":"sean","sex":"male","school":{"name":"SE university","location":"Nanjing"}}

通过 json_decode() 对 JSON 格式的字符串进行解码,并转换为 PHP 变量。

<?php    $person=array('name' => 'sean' , 'sex'=>'male', 'school'=>array('name'=>'SE university', 'location'=>'Nanjing'));    $jsonText = json_encode($person);    var_dump(json_decode($jsonText));?>

输出结果为;

object(stdClass)[1]  public 'name' => string 'sean' (length=4)  public 'sex' => string 'male' (length=4)  public 'school' =>     object(stdClass)[2]      public 'name' => string 'SE university' (length=13)      public 'location' => string 'Nanjing' (length=7)
0 0
原创粉丝点击