Javascript字符串與JSON字符串的最大區別在於,JSON字符串必須使用雙引號(單引號會致使語法錯誤)數組
與Javascript的對象字面量相比,JSON對象有兩個地方不同。首先,沒有聲明變量(JSON中沒有變量的概念)。其次,沒有末尾的分號(由於這不是Javascript語句,因此不用分號)。函數
JSON對象的屬性必須加雙引號。spa
JSON對象有兩個方法:3d
stringify(),把Javascript對象序列化爲JSON字符串code
parse(),把JSON字符串解析爲Javascript值對象
在默認狀況下,JSON.stringify()輸出的JSON字符串不包含任何空格字符串或是縮進。blog
在序列化Javascript對象時,全部函數及原型成員都會被忽略,不體現結果中,此外,值爲undefined的任何屬性也都會被跳過,結果中最終都是值爲有效JSON數據類型的ip
實例屬性。字符串
var obj={ name:'Jack', age:29, school:{ name:'Middle School', age:'', location:undefined } } var c = JSON.stringify(obj) console.log(c)//{"name":"Jack","age":29,"school":{"name":"Middle School","age":""}}由於location的值是undefined,因此輸出的值location已通過濾掉了
var d = JSON.parse(c);
通常狀況下,d 與 obj 具備相同的屬性,可是它們是兩個獨立的、沒有任何關係的對象。原型
若是,傳給JSON.parse()的字符串不是有效的JSON,該方法會拋出錯誤。
JSON的序列化選項
JSON.stringify()除了要序列化的Javascript對象外,還能夠接受2個參數,這兩個參數用於指定以不一樣的方式序列化Javascript對象。第一個參數是個過濾器,也能夠是個函數;第二個參數是一個選項,表示是否在JSON中保留縮進。
var obj={ name:'Jack', age:29, school:{ name:'Middle School', age:'', location:undefined } } var a = JSON.stringify(obj,["name","age"]) //若是參數是個數組,那麼JSON.stringify()的結果中將只保留數組中列出的屬性 console.log(a)//{"name":"Jack","age":29}
當第二個參數是一個函數的時候
var obj={ name:'Jack', age:29, school:{ name:'Middle School', age:'', location:undefined } } var a = JSON.stringify(obj,function(key,value){ //至關於遍歷對象 switch (key) { case 'name': return 'Jane'; //當key值爲name的時候,返回的value值爲Jane,注意,是對象裏面全部key值爲name,嵌套的也包括在內 break; case 'age': return value+1;//當keu值爲age的時候,將原來的值+1 break; } return value }) console.log(a)//{"name":"Jane","age":30,"school":{"name":"Jane","age":"1"}}
第三個參數
var obj={ name:'Jack', age:29, school:{ name:'Middle School', age:'', location:undefined } } console.log(obj) var a = JSON.stringify(obj,null,4) console.log(a) var b = JSON.stringify(obj,null,2) console.log(b) var c = JSON.stringify(obj,null,'---') console.log(c)
對應的結果
toJSON()方法
var d=new Date(); var b = d.toJSON(); console.log(b)//2018-06-03T14:56:57.322Z
某些原生對象存在toJSON()方法。
toJSON()對象能夠做爲函數過濾器的補充。
把一個對象傳入進JSON.stringify(),序列化的過程以下:
(1)若是存在toJSON()方法,並且能經過它取得有效的值,則調用方法。不然,調用自己。
(2)若是提供了第二個參數,應用這個函數過濾器。傳入函數過濾器的值是第(1)步返回的值。
(3)對第(2)步返回的每一個值進行相應的序列化。
(4)若是提供了第三個參數,執行相應的格式化。
解析函數
JSON.parse()方法也能夠接收另外一個參數,該參數是一個函數,將在每一個鍵值對兒上調用。這個函數能夠稱爲還原函數。
若是還原函數返回undefined,則表示要從結果中刪除相應的鍵;若是返回其餘的值,則將該值插入到結果中。在將日期字符串轉換爲Date對象時,常常要用到還原函數。
var obj={ name:'Jack', age:29, school:{ name:'Middle School', age:'', location:undefined } } var a = JSON.stringify(obj) var b =JSON.parse(a,function(key,value){ if(key == 'age'){ return value+1 }else if(key == 'name'){ return undefined }else{ return value } }) console.log(b)
由於當key值爲name的時候,返回的undefined,因此返回的新對象裏面name屬性被刪掉。