話說JSON數據平常用的確實挺多的,但是基本上只知道怎麼用,對其一些細節並沒有整理過,今兒趁著下午有點空,坐下來,學習整理下,並分享出來。 對於JSON,首先它只是一種數據格式,並非一種語言,雖然和javascript長的比較像,但並不從屬於javascript。如果你使用過其他編程...
話說JSON數據平常用的確實挺多的,但是基本上只知道怎麼用,對其一些細節並沒有整理過,今兒趁著下午有點空,坐下來,學習整理下,並分享出來。
對於JSON,首先它只是一種數據格式,並非一種語言,雖然和javascript長的比較像,但並不從屬於javascript。如果你使用過其他編程語言,就會知道,其他語言也有針對JSON的解析器和序列化器。
JSON可以表示以下3中類型的值
- 簡單值 如字元串、數值、布爾值和null,但不支持undefined
- 對象 對象作為一種複雜的數據類型,表示是一組無序的鍵值對兒,值可以是簡單值也可以複雜的數據
- 數組 數組作為一種複雜的數據類型,表示是一組有序的列表兒,可以通過索引來獲取引用的值,值可以是簡單值,也可以複雜數據對象
1 . 簡單值
簡單值里沒有什麼可以重點講的,主要強調一點,而且非常重要,那就是 JSON 字元串必須使用雙引號,單引號會報錯。
2. 對象
javascript 中的對象
var object = { name:"suyq", age :9 }
JSON 對象
{ "name":"suyq", "age" :9 }
與javascript對象相比,JSON對象有兩個地方不一樣
- 沒有聲明變數(JSON中沒有變數的概念)
- 末尾沒有分號
再說一遍 對象的屬性必須加雙引號,這個是必須的。
屬性的值可以是簡單類型,也可以是複雜類型的值。
{ "name":"suyq", "age" :9, "school":{ "name":"tjn", "location":"tj" } }
3.數組
javascript中的數組字面量
var v = [1,"hi",true];
JSON中的數組
[ { "name": "張三", "age": 18 }, { "name": "李四", "age": 22 }, { "name": "王五", "age": 20 } ]
JSON對象
json 對象主要有兩個方法
JSON.stringify();
把javascript 對象轉換為json對象
var book = { title:"javascript", authors:["li","susan"], year:2011,
edition:undefined
}; console.log(JSON.stringify(book));
輸出結果:
{"title":"javascript","authors":["li","susan"],"year":2011}
預設情況下,javascript.stringify()所輸出的json 字元串不包含任何空格字元和縮進。
值為undefined的任何屬性會被跳過。
序列號選項
javascript.stringify() 函數還可以接收兩個參數,第一個參數是個過濾器,可以是個數組,也可以是個函數,第二個是字元串中保留縮進。
1.過濾器
var book = { title:"javascript", authors:["li","susan"], year:2011, edition:undefined }; console.log(JSON.stringify(book,["title"]));
輸出結果:{"title":"javascript"}
如果第二個參數是函數,傳入的函數有兩個參數,屬性鍵名和鍵值。話不多說,直接上例子。
var book = { title:"javascript", authors:["li","susan"], year:2011, edition:undefined }; console.log(JSON.stringify(book,function(key,value){ switch (key) { case "authors": return value.join(","); case "edition": return undefined; default : return value; } }));
輸出結果:{"title":"javascript","authors":"li,susan","year":2011}
2.字元串縮進
var book = { title:"javascript", authors:["li","susan"], year:2011, edition:undefined }; console.log(JSON.stringify(book,function(key,value){ switch (key) { case "authors": return value.join(","); case "edition": return undefined; default : return value; } },5));
輸出結果:
{ "title": "javascript", "authors": "li,susan", "year": 2011 }
註意:最大縮進空格數為10 ,大於10 自動轉換為10縮進。
2.toJSON 方法
var book = { title:"javascript", authors:["li","susan"], year:2011, edition:undefined, toJSON :function() { return this.title; } };
輸出結果:"javascript"
有時候如果JSON.stringify()還無法滿足序列化需求,可以通過對象上調用toJSON()方法,返回其自身的JSON數據格式。
toJSON()函數可以作為過濾器的補充。
把一個對象傳入JSON.stringify(),序列化順序如下
1.如果存在toJSON()方法,而且通過它可以取到有效值,則先調用它。否則,按照預設順序執行序列化
2.如果提供第二個參數,執行該過濾器,傳入過濾器的值是第一步的返回值
3.對第二步返回的值進行相應的序列化
4.如果提供了第三個參數,執行的相應的格式化
JSON.parse();
json.parse() 也可以接收另一個參數,該參數也是一個函數。
var book = { title:"javascript", authors:["li","susan"], year:2011, edition:undefined, releaseDate:new Date(2011,1,1) }; var jsonText = JSON.stringify(book); var bookcopy = JSON.parse(jsonText,function(key,value){ if(key=="releaseDate") { return new Date(); }else { return value; } }) console.log(bookcopy.releaseDate.getFullYear());
輸出結果:2016