早期,一般是使用XML作為互聯網上傳輸結構化數據的,但由於它解析麻煩,字符冗長,因此被輕量級的JSON所逐漸替代。JSON是JavaScript的一個嚴格子集,利用了JavaScript中一些模式來表示結構化的數據。可以直接將JSON格式的字符串傳遞給eval()進行處理,由於JSON是JS的子集,eval后變成json對象,可以使用’.’操作符直接操作屬性;
值得注意:JSON是一種數據格式,不是一種語言,雖然與JS中定義對象字面量的形式相似,但JSON不從屬於JavaScript,因為其它語言(如:PHP,JSP)中也有針對JSON的解析和序列化的方法操作。
語法
JSON可以表示以下三種值:
- 簡單值:如字符串、數值、布爾值和null,但不支持undefined
- 對象:對象作為一種復雜的數據類型,表示是一組無序的鍵值對兒,值可以是簡單值也可以復雜的數據
- 數組:數組作為一種復雜的數據類型,表示是一組有序的列表兒,可以通過索引來獲取引用的值,值可以是簡單值,也可以復雜數據對象
一個簡單的JSON示例:
{ "name": "Jack", "age": 30, "isMan": true, "school": { "name": "Lonton University", "location": "English" } }
非常重要:JSON對象的屬性(如上例中的“name”)必須加雙引號。
在實際使用中,經常會因為上面使用單引號或不使用引號造成序死化錯誤,從而無法生成JSON對象
序列化
JSON被大家所認可,除了語法是JavaScript語法子集,更主要是可以直接eval序列化(但有一定風險,可能會執行一些惡意代碼,如讀cookie等)成可用的JS對象直接使用。ECMAScript 5對解析JSON進行規范,定義了全局對象JSON,支持的瀏覽器有:IE8+,Firefox 3.5+,Safari4+,Chrome和Opera 10.5+;
JSON對象提供兩個方法:stringify()和parse(),stringify()是將JSON對象轉成字符串,而parse()則是將符合規范的字符串轉成可用JSON對象。
stringify()
JSON.stringify(value [, replacer] [, space])
value:JSON對象。
replacer:過濾器(可選的),可以是方法或數組,用於過濾操作,如果是數組,則序列化字符串只包含數組中指定的值的JSON屬性及屬性值,如果是方法,方法傳遞key,value,可以對JSON對象每一個屬性值及值進行處理后返回。
space:是否保留縮進,默認不保留,並且刪除所有換行。
1.如果省略的話,那么顯示出來的值 就沒有分隔符。直接輸出來
2.如果是一個數字的話,那么它就定義縮進幾個字符,當然 如果大於10 ,則最大值為10.
3.如果是一些轉義字符,比如“\t”,表示回車,那么它每行一個回車。
4.如果僅僅是字符串,OK,就在每行輸出值的時候把這些字符串附加上去就OK。當然,最大長度也是10個字符。
實例:
var student = new Object(); student.name = "Lanny"; student.age = "25"; student.location = "China"; var json = JSON.stringify(student); alert(json); //{"name":"Lanny","age":"25","location":"China"}
使用數組過濾,只保留:name及locaiton
var json = JSON.stringify(student,["name","location"]); alert(json);//{"name":"Lanny","location":"China"}
使用函數過濾,對於name屬性值單獨處理,在之前輸出:”my name is :”
var json = JSON.stringify(student, function (key, value) { switch (key){ case "name": return "my name is " + value; default : return value; } }); alert(json);//{"name":"my name is Lanny","age":"25","location":"China"}
使用縮進,縮進4個空白:
var json = JSON.stringify(student,null,4);alert(json);//返回結果如下:{"name": "Lanny","age": "25","location": "China"}
parse()
JSON.parse(text [, reviver])
參數
text :必需。 一個有效的 JSON 字符串。
reviver :可選。 一個轉換結果的函數。 將為對象的每個成員調用此函數。 如果成員包含嵌套對象,則先於父對象轉換嵌套對象。 對於每個成員,會發生以下情況:
-
如果 reviver 返回一個有效值,則成員值將替換為轉換后的值。
如果 reviver 返回它接收的相同值,則不修改成員值。
-
如果 reviver 返回 null 或 undefined,則刪除成員。
返回值:一個對象或數組
示例:
var jsontext = '{"firstname":"Jesper","surname":"Aaberg","phone":["555-0100","555-0120"]}'; var contact = JSON.parse(jsontext);
以下示例演示了如何使用 JSON.stringify 將數組轉換成 JSON 字符串,然后使用 JSON.parse 將該字符串還原成數組。
var arr = ["a", "b", "c"]; var str = JSON.stringify(arr); document.write(str); document.write ("<br/>"); var newArr = JSON.parse(str); while (newArr.length > 0) { document.write(newArr.pop() + "<br/>"); } // Output: var arr = ["a", "b", "c"]; var str = JSON.stringify(arr); document.write(str); document.write ("<br/>"); var newArr = JSON.parse(str); while (newArr.length > 0) { document.write(newArr.pop() + "<br/>"); } // Output: ["a","b","c"] c b a