json對象和json字符串

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屬性被刪掉。

相關文章
相關標籤/搜索