关于JSON,我们首先要了解的是它只是一种数据格式,不是一种编程语言,它从不属于JS,并不只有Js才使用JSON。
1.语法
JSON的语法,可以表示简单值,对象,数组,但它不支持变量,函数,实例对象,他就是一种表示结构化数据的格式
(1)简单值
最简单的JSON数据形式就是简单值,例如:5就是JSON表示数值5的方式;"Hello world"是表示字符串的方式,但在JSON中字符串必须要用双引号;此外还有布尔值,null值,但不支持undefined.
(2)对象
JSON对象表示对象的方式:
{
"name":"Tom",
"age":18
}
与JS不同的是,JSON不需要声明变量,也没有分号结尾,并且对象的属性必须加双引号,属性值可以是简单值,也可以是复杂类型,因此可以这样在对象中嵌入对象
{
"name": "Tom",
"age": 18,
"friends": {
"name": "Jerry",
"age": 16
}
}
(3)数组
JSON数组采用的是JS中的数组字面量形式
["Tom",18,true]
将数组与对象结合起来,可以构成更复杂的数据集合
[ { "name": "Tom", "age": 18, "friends":[ "Jerry" ] }, { "name": "Nancy", "age":16, "friends":[ "Nicholas" ] },{ "singer": "MC天佑", "age": "28", "example": [ "一人我饮酒醉", "刀山火海" ] } ]
2.解析与序列化
JSON对象有两个方法:stringify()和parse(),分别用于将JS对象序列化为JSON对象和把JSON字符串解析为JS值
var michael = { singer:"MC天佑", age:28, example:["一人我饮酒醉"] } var jsonText = JSON.stringify(book);
上面这段代码就是将michael对象序列化为jsonText变量中,由于JSON.stringify()输出的JSON字符串不包含任何空格字符或缩进,因此保存在jsonText中的字符串如下所示:
{"singer":"MC天佑","age":28,"example":["一人我饮酒醉"]}
这个函数还可以接受两个参数,第一个参数是一个数组或者函数,第二个函数是一个选项,表示是否在JSON中保留缩进。
如果参数是数组,那么结果就显示只包含数组中列出的属性
var jsonText = JSON.stringify(michael,["singer","age"]);
结果是{"singer":"MC天佑","age":28}。
参数是函数时,函数要接受两个参数,键值和属性值,根据键值决定如何处理要洗泪花的对象中的属性
var jsonText = JSON.stringify(michael,function(key,value){ switch(key){ case "example": return value.join(","); case "age": return 100 case "singer": return undefined; default: return value; } });
这里的结果是{"age":100,"example":"一人我饮酒醉"},这里根据传入的键来决定结果,其中我们发现如果返回的是undefined,那就删除该属性,最后一定要提供default,返回传入的值。
第三个参数是控制结果中的缩进和空白符,如果是一个数字,那他表示每个级别缩进的空格数,最大的所金属为10,大于10的数会自动转为10,例如要早每个级别缩进4个空格
var jsonText = JSON.stringify(michael,null,4);
其结果就是
{ "singer": "MC天佑", "age": 28, "example": [ "一人我饮酒醉" ] }
如果传入的是字符串,那这个字符串就会用作缩进字符
var jsonText = JSON.stringify(michael,null,"--");
结果返回的是
{ --"singer": "MC天佑", --"age": 28, --"example": [ ----"一人我饮酒醉" --] }
在某些情况下,我们可以给对象定义toJSON()方法,返回自身的JSON数据格式
var michael = { singer:"MC天佑", age:28, example:["一人我饮酒醉"], toJSON:function(){ return this.singer; } } var jsonText = JSON.stringify(michael);
这里返回的结果是singer的属性值
使用JSON.parse()就可以将JSON字符串解析为相应的JS值
var michaelCopy = JSON.parse(jsonText);
虽然michaeal与michaelCopy有相同的属性,但他们是两个独立的、没有任何关系的对象