一、JSON定义
JSON指JavaScript 对象表示法(JavaScript Object Notation),它是一种轻量级的数据交换格式。
JSON 值可以是:
- 数字(整数或浮点数)
- 字符串(在双引号中)
- 逻辑值(true 或 false)
- 数组(在方括号中)
- 对象(在花括号中)
- null
其中,1、2、3、6是简单值,5、6是复杂数据类型。对象表示的是一组无需的键值对儿,数组表示一组有序的值的列表。除以上6种外,再无其他,没有像js一样的undefined、NAN,JSON拒绝使用。
二、对象
JSON中的对象与JS字面量有些不同,JS对象字面量:
var person = {
name : "Nicholas",
age : 29
};
JSON表示上述对象的方式如下:
{
"name" : "Nichloas",
"age" : 29
}
不同:1、没有生命变量(JSON中没有变量的概念);2、没有末尾的分号。
三、数组
可以通过数值索引来访问其中的值。
JS中的数组字面量:
var values = [25, "hi" , true];
JSON表示:
[25, "hi", true]
四、JSON对象
JavaScript的eval()函数可以用来解析JSON并返回JavaScript对象,不过eval()对JSON结构求值是存在风险的.因此,在ECMAScript5中新增了全局的JSON对象.JSON对象有两个方法:stringify()和parse().
stringify()用于把JavaScript对象序列化为JSON字符串;
parse()用于把JSON字符串解析为原生的JavaScript值.
五、序列化选项
JSON.stringify()方法有三个参数:
第一个参数是要序列化的JavaScript对象;
第二个参数是过滤器,可以是一个数组或者函数;如果过滤器是函数,传入的函数有两个参数:属性名和属性值.根据属性名来判断如何处理序列化对象中相应的属性.如果函数返回了undefined,那么相应的属性就会被忽略.
第三个参数是一个布尔值,表示是否在JSON字符串中保留缩进.如果缩进参数传入的是数值,表示每个json字段缩进的空格数,但是最大缩进空格数不超过10.
//过滤结果
var book={
"title":"Professional JavaScript",
"authors":["Nicholas C.Zakas"],
edition:3;
year:2011
};
var jsonText=JSON.stringify(book,["title","edition"]);//第二个参数是数组
var jsonText=JSON.stringify(book,function(key,value){//第二个参数是函数
switch(key){
case "authors":
return value.join(",")
cae "year":
return 5000;
case "edition"
return undefined;
default:
return value;
}
});
//字符串缩进
var jsonText=JSON.stringify(book,null,4);
var jsonText=JSON.stringify(book,null,"--");
如果JSON.stringify()不能满足某些对象的序列化需求,可以给对象自定义toJSON方法,返回其自身的JSON数据格式。
//toJSON()方法
var book={
"title":"Professional JavaScript",
"authors":["Nicholas C.Zakas"],
edition:3;
year:2011,
toJSON:function(){
return this.title;
}
};
var jsonText=JSON.stringify(book);
//通过对象上调用toJSON()方法,返回其自身的JSON数据格式
综合以上几种情况,JSON.stringify()序列化对象的顺序如下:
①如果对象存在toJSON方法且能返回有效值,则调用该方法;否则,仍然按照默认顺序执行序列化。
②如果stringify()存在第二个参数,应用这个过滤器;
③对第②步返回的每个值进行序列化;
④如果存在第三个参数,执行相应的格式化。
六、解析选项
JSON.parse()用来将JSON字符串解析成JavaScript对象。
该方法第一个参数要解析的JSON字符串;
第二个参数是一个函数还原函数。还原函数有两个参数key和value。如果还原函数返回undefined,则表示将该属性从结果中删除;如果返回其它值,则将该值插入到结果当中。在将日期字符串转换为Date对象时,经常用到还原函数.
JSON.parse()方法可以接受一个函数参数:
var book{
"title":"Professional JavaScript",
"authors":["Nicholas C.Zakas"],
edition:3;
year:2011,
releaseDate:new Date(2011,11,1)
};
var jsonText=JSON.stringify(book);
var bookCopy=JSON.parse(jsonText,function(key,value){
if(key=="releaseDate"){
return new Date(value),
}else{
return value;
}
});
alert(bookCopy.releaseDate.getFullYear());
问题1:
JSON取值方括号和点的区别
问题2:
stringify和parse的深浅拷贝