json对象两个方法的解析

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.如果存在第三个参数,则执行相应的格式化

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章