JSON是一個輕量級的數據格式,可以簡化表示數據結構的工作量。在實際工作中,我們經常用它來傳遞數據,不過對於其使用的一些細節還是需要注意的。在ECMAScript5中定義了原生的JSON對象,可以用來將對象序列化為JSON字符串,或者將JSON數據解析為javascript對象。
一、JSON語法
JSON可以用來表示三種類型的值:簡單值、對象和數組。對象和數組一般是JSON結構的最外層形式。
1.JSON簡單值
可以在JSON中表示字符串、數值、布爾值、null。
例如:
5//數值類型 "hello json"//字符串類型
注意:
①JSON不支持js中的特殊值undefined;
②JSON字符串必須使用雙引號,不能使用單引號。
③在實際應用中,JSON一般用來表示較復雜的數據結構,而簡單值一般用作復雜數據結構中的一部分。
2.對象
JSON對象與JavaScript對象字面量對象的語法是類似的。
//JavaScript對象字面量表示 var jsWeatherinfo={ city:"北京", cityid:"101010100", weather:"多雲轉晴" //JSON對象 { "city":"北京", "cityid":"101010100", "weather":"多雲轉晴" }
但是有幾點不同:
①JSON中沒有變量的概念,所以沒有聲明變量;
②JSON末尾沒有分號;
③JSON對象中的屬性名一定要使用雙引號,而JavaScript對象中的屬性引號是可有可無的。
3.數組
JSON數組采用的是javascript的數組字面量形式.
//JavaScript數組 var result=[1,true,"today"]; //JSON數組 [1,true,"today"]
區別:JSON數組沒有末尾的分號,也沒有聲明變量.
二、JSON序列化
1.JSON對象
JavaScript的eval()函數可以用來解析JSON並返回JavaScript對象,不過eval()對JSON結構求值是存在風險的.因此,在ECMAScript5中新增了全局的JSON對象.JSON對象有兩個方法:stringify()和parse().
stringify()用於把JavaScript對象序列化為JSON字符串;
parse()用於把JSON字符串解析為原生的JavaScript值.
var weather={ 'city': '北京', 'cityid': '101010100', 'temp1': '31℃', 'temp2': '20℃', 'weather': '多雲轉晴', 'img1': 'd1.gif', 'img2': 'n0.gif', 'ptime': '11:00' }; var text=JSON.stringify(weather); var json=JSON.parse(text); json.weather;//"多雲轉晴"
2.JSON.stringify()
JSON.stringify()方法有三個參數:
第一個參數是要序列化的JavaScript對象;
第二個參數是過濾器,可以是一個數組或者函數;
第三個參數是一個布爾值,表示是否在JSON字符串中保留縮進.
①過濾器
如果過濾器參數是數組,那么stringify()結果中只包含該數組中列出的屬性.
var weather={ 'city': '北京', 'cityid': '101010100', 'temp1': '31℃', 'temp2': '20℃', 'weather': '多雲轉晴', 'img1': 'd1.gif', 'img2': 'n0.gif', 'ptime': '11:00' }; var text=JSON.stringify(weather,["city","weather","temp1","temp2"]); //結果:"{"city":"北京","weather":"多雲轉晴","temp1":"31℃","temp2":"20℃"}"
如果過濾器是函數,傳入的函數有兩個參數:屬性名和屬性值.根據屬性名來判斷如何處理序列化對象中相應的屬性.如果函數返回了undefined,那么相應的屬性就會被忽略.
var text1 = JSON.stringify(weather, function (key, value) { switch (key) { case 'temp1': return '最高溫度' + value; case 'temp2': return '最低溫度' + value; case 'img1': case 'img2': case 'ptime': return undefined;//屬性被忽略 default: return value; } }); //結果:"{"city":"北京","cityid":"101010100","temp1":"最高溫度31℃","temp2":"最低溫度20℃","weather":"多雲轉晴"}"
③字符串縮進
JSON.stringify()第三個參數用來控制結果中的縮進情況.
如果縮進參數傳入的是數值,表示每個json字段縮進的空格數,但是最大縮進空格數不超過10.
var text2=JSON.stringify(weather,null,5)
如果縮進參數傳入的是字符串,則表示JSON字符串中每個級別都使用該字符串作為縮進字符.不過該字符串也不能超過10個字符長.
var text3=JSON.stringify(weather,null,"--")
④toJSON()方法
如果JSON.stringify()不能滿足某些對象的序列化需求,可以給對象自定義toJSON方法,返回其自身的JSON數據格式。
var weather={ 'city': '北京', 'cityid': '101010100', 'temp1': '31℃', 'temp2': '20℃', 'weather': '多雲轉晴', toJSON:function(){ return this.city+this.weather+",最高溫度"+this.temp1+",最低溫度"+this.temp2; } }; JSON.stringify(weather);//""北京多雲轉晴,最高溫度31℃,最低溫度20℃""
綜合以上幾種情況,JSON.stringify()序列化對象的順序如下:
①如果對象存在toJSON方法且能返回有效值,則調用該方法;否則,仍然按照默認順序執行序列化。
②如果stringify()存在第二個參數,應用這個過濾器;
③對第②步返回的每個值進行序列化;
④如果存在第三個參數,執行相應的格式化。
三、JSON解析
JSON.parse()用來將JSON字符串解析成JavaScript對象。
該方法第一個參數要解析的JSON字符串;
第二個參數是一個函數還原函數。還原函數有兩個參數key和value。如果還原函數返回undefined,則表示將該屬性從結果中刪除;如果返回其它值,則將該值插入到結果當中。在將日期字符串轉換為Date對象時,經常用到還原函數.
var json = { 'city': '北京', 'cityid': '101010100', 'temp1': '19℃', 'temp2': '32℃', 'weather': '晴', 'ptime': new Date() }; var text = JSON.stringify(json); JSON.parse(text, function (key, value) { switch (key) { case 'ptime': return new Date(value);//返回日期對象 case 'cityid': return undefined;//刪除該屬性 default: return value; } });