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.如果存在第三個參數,則執行相應的格式化

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