關於JSON,最重要的是要理解它是一種數據格式,而不是一種編程語言。雖然具備相同的語法,但JSON並不從屬於JavaScript。並且,並非只有JavaScript才使用JSON,畢竟JSON只是一種數據格式。不少編程語言都有針對JSON的解析器和序列化器。javascript
首先,說一下JSON的語法,JSON由三種類型組成,簡單、對象、數組。簡單值包括數值、字符串、布爾值、null。對象由一組鍵值對組成,其中能夠嵌套數組和對象。數組表示一組有序的值得列表,能夠包含數組和對象。java
console.log(JSON.parse(1))
這樣寫是沒有錯的,能夠直接解析數值,可是這個沒有意義,通常實際運用中JSON都是以對象或數組的方式呈現。下面看看對象的表示法:編程
{ "name" : "Miracle", "age" : 24 } [1,2,"sd"]
JSON的對象和數組與JavaScript的對象字面量和數組字面量很像,在JSON中全部的鍵都要用雙引號包裹,不然會致使語法錯誤。而字符串的值也必須使用雙引號包裹,不能使用單引號,由於會致使語法錯誤,在數組中也是同樣。在JSON中對象能夠包含數組,而一樣數組也能夠包含對象。數組
{ "name" : "Miracle", "age" : 24, "skills" : ["AJAX", "ES5", "HTML5", "CSS3"], "friends" : [ { "name" : "kirs", "age" : 23 }, { "name" : "HQ", "age" : 22 } ] }
上列代碼最外圍是一個對象,其中包含了2個簡單值,和兩個數組,而第二個數組"friends"中又包含了兩個對象。瀏覽器
解析與序列化數據結構
在JSON對象誕生以前,JSON的解析一直是使用eval()函數,使用eval()對JSON數據結構求值存在風險,由於可能會執行一些惡意代碼。ECMAScript 5對解析JSON的行爲進行了規範,定義了全局對象JSON。支持這個對象的瀏覽器有IE8+、Firefox 3.5+、Safari 4+、 Chrome 和Opera 10.5+。編程語言
JSON對象有兩個方法:stringify()和parse()。stringify()用於將JSON對象的實例轉換爲JSON字符串,而JSON.parse()則將一個JSON字符串解析爲JSON對象。函數
var jobj = { "name" : "Miracle", "age" : 24 } var jtext = JSON.stringify(jobj); console.log(jtext); //'{"name":"Miracle","age":24}' console.log(typeof jtext); //string var obj = JSON.parse(jtext); console.log(obj.name); //"Miracle"
在執行JSON.stringify()方法的時候對於JS中的特殊值好比undefined,function類型會忽略掉當前的鍵值對。對象
var jobj = { "name" : "Miracle", "age" : 24, "un" : undefined, "getName" : function(){ alert(0); } } console.log(JSON.stringify(jobj)); //'{"name":"Miracle","age":24}'
上述代碼中jobj對象中包含了一個鍵爲"un",它的值是undefined因爲JSON不識別這種基本類型,因此會將鍵和值所有忽略。JS中的funciton也是。blog
JSON.stringify()方法一共有三個參數,第一個參數是要轉化的對象,這個參數是必選項,第二個參數是過濾設置,能夠是數組,也能夠是function。第三個參數是一個格式化的設置,能夠是字符串或者數值。注意這裏的過濾和格式化都是對對象的操做。
var jobj = { "name" : "Miracle", "age" : 24, "siklls" : ["AJAX", "ES5", "HTML5", "CSS3"] } console.log(JSON.stringify(jobj, ["name"])); //'{"name":"Miracle"}'
若是JSON.stringify()方法的第二個參數是一個數組,那麼在執行的時候會匹配數組中的值與每一個鍵的名稱是否同樣,若是有返回這個鍵值對,沒有就忽略。若是一個都沒有最終返回空對象字符串"{}"。
var jobj = { "name" : "Miracle", "age" : 24, "siklls" : ["AJAX", "ES5", "HTML5", "CSS3"] } var s = JSON.stringify(jobj, function(key, val){ if(key == "name"){ return "who are you?"; }else if(key == "siklls"){ return undefined; }else { return val; } }); console.log(s); //{"name":"who are you?","age":24}
若是JSON.stringify()第二個參數是函數,那麼根據函數返回的值來來匹配,若是函數自始至終都沒有返回,那麼結果就是undefined。這個函數接受兩個參數,當前的鍵和值,而後根據結果返回當前鍵和改變後的值。例如代碼中else if判斷中 結果返回了undefined ,前面說過了若是返回的不是JSON類型的數據,JSON會自動過濾。
JSON.stringify()方法的最後一個參數是用來格式化字符串。改參數是一個字符串或者數值類型。若是是數值,則使用當前數值的空格數來縮進,若是是字符串則使用字符串來縮進,注意,這裏會自動換行。
var jobj = { "name" : "Miracle", "age" : 24, "siklls" : ["AJAX", "ES5", "HTML5", "CSS3"] } var s = JSON.stringify(jobj, null, 4); console.log(s);
上圖是使用Chromg 控制檯查看的結果。