json对象有两个方法:stringify()和parse()。在最简单的情况下,这两个方法分别用于把js对象序列化为json对象和把json对象解析为原生js对象。
例如:
代码如下:
<html>
<head>
<title></title>
<script type="text/javascript">
function init(){
var book={
title:"JavaScript高级程序设计",
authors:[
"Nicholas C. Zakas"
],
edition:3,
year:2011
};
var jsonBook=JSON.stringify(book);
var objectBook=JSON.parse(jsonBook);
var title=objectBook.title;
}
</script>
</head>
<body>
<input type="button" value="测试" οnclick="init()">
</body>
</html>
默认情况下,JSON.stringify()序列化的JSON字符串中不包含任何空字符串或缩进,因此保存在jsonBook中的字符串如下所示:
{"title":"JavaScript高级程序设计","authors":["Nicholas C. Zakas"],"edition":3,"year":2011}
JSON.stringify()除了要序列化js对象外,还可以接收两外两个参数,这两个参数用于指定不同方式序列化js对象。第一个参数是过滤器,可以使一个数组,也可以是一个函数;
第二个参数是一个选项,表示是否在json字符创中保留缩进。单独或组合使用这两个参数,可以更全面深入地控制json的序列化。
1、过滤效果
如果过滤器参数是数组,那么JSON.stringify()序列化的结果中将只包含数组中列出的属性。如:
student={
name:"Bill",
age:12,
grade:3,
id:"0802020114"
};
jsonText=JSON.stringify(student,["name","id"]);
jsonText的值为{“name”:"Bill","id":"0802020114"}
如果第二参数是函数,行为会有一点不同。传入的函数接收两个参数:属性(键)名和属性(键)值。根据属性名可以知道应该如何处理要序列化的对象中的属性,属性名只能是字符串。为了改变序列化对象的结果,函数返回的值就是相应键的值。不过要注意,如果函数返回了undefined,那么相应的属性会被忽略。如:
student={
name:"Bill",
age:12,
grade:3,
id:"0802020114",
subject:["math","Chinese","English"]
};
jsonText=JSON.stringify(student,jsonCconvert);
function jsonConvert(key,value){
switch(key){
case "name":
return "Lily";
case "grade":
return undefined;
case "subject":
return value.join(",");
default:
return value;
}
}
这里根据传入的键来决定结果。如果键为name,就将其值设置为Lily;如果为grade就返回undefined来删除该属性;如果为subject,他是一个数组,就将它通过数组方法join()转化为以逗号连接的字符串。最后一定要提供default项,使其他的值都能够正常出现在结果中,不然就会出错,没有结果。上面的jsonText的值如下:
{“name”:"Lily","age":12,"id":"0802020114","subject":"math,Chinese,English"}
2、字符串缩进
JSON.stringify()方法的第三个参数用于控制结果中的缩进和空白符。只要传入有效地控制缩进的参数值,结果字符串就会包含换行符!
如果这个参数是一个数值,那么它代表的事每个级别缩进的空格数,最大缩进空格数为10,对于大于10的参数值会自动转换为10
book={ title:"JavaScript高级程序设计", authors:[ "Nicholas C. Zakas" ], edition:3, year:2011 };
jsonBook=JSON.stringify(book,null,8);jsonBook的值为:
{
"title": "JavaScript高级程序设计",
"authors": [
"Nicholas C. Zakas"
],
"edition": 3,
"year": 2011
}
如果传入的是一个字符串,则以该字符串作为缩进符。
如 jsonBook=JSON.stringify(book,null,"**");
则结果为
{
**"title": "JavaScript高级程序设计",
**"authors": [
****"Nicholas C. Zakas"
**],
**"edition": 3,
**"year": 2011
}
3、toJSON方法
有时候JSON.stringify()还是不能满足对某些对象进行自定义序列的需求。在这些情况下,可以通过在js对象上调用toJSON()方法,返回其自身的JSON数据格式。如:
student={
name:"Bill",
age:12,
grade:3,
id:"0802020114",
subject:["math","Chinese","English"],
toJSON:function(){
return this.name+"_"+this.id;
}
};
jsonText=JSON.stringify(student);//"Bill_0802020114"
toJSON()可以作为函数过滤器的补充。因此理解序列化的内部顺序十分重要。假设把一个js对象传入JSON.stringify(),序列化该对象的顺序是:
1.如果存在toJSON()方法而且能够通过它取得有效值,则调用该方法。否则,按默认顺序执行序列化。
2.如果提供了第二个参数,应用这个函数过滤器
3.如果存在第三个参数,则执行相应的格式化