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