JSON: JavaScript Object Notation(JavaScript 对象表示法),是一种轻量级的文本数据交换格式,而不是一种编程语言。JSON 文本格式在语法上与创建 JavaScript 对象的代码相同,因此无需解析器。当然,并不是只有JavaScript能使用JSON,毕竟它只是一种数据交换格式,其他的编程语言都有针对JSON的解析器和序列化器。
JSON的语法与JavaScript语法比较相似,可以简单概括如下:
JSON对象与JavaScript中的对象表示方法有所不同:
JavaScript对象:
var person = {
name : "sean",
sex : "male"
};
JSON表示上述对象的方式如下:
{
"name" : "sean",
"sex" : "male" }
通过比较发现两者还是有一些区别的:JSON中不用申明变量,也没有变量的概念,结尾处不需要分号,另外就是JSON中对象的属性必须用双引号。
如果要表示多个上述的对象,则要用到数组,表示方法如下:
[
{
"name" : "sean",
"sex" : "male" },
{
"name" : "jack",
"sex" : "male" },
{
"name" : "mary",
"sex" : "female" }
]
通过把数组和对象结合起来,就可以构成更复杂的数据集合。
JSON对象有两个方法:stringify()和parse(),这两个方法分别用于把JavaScript对象序列化为JSON字符串和把JSON字符串解析为原生的JavaScript值。
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"}
这里我们只需要注意序列化的顺序:
将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对象。通过以下结果可以看出来对象与字符串之间的转换。
很多时候在进行前后端交互时,后台程序使用的是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)