javascript
读javascript高级程序设计13-JSON
JSON是一個輕量級的數(shù)據(jù)格式,可以簡化表示數(shù)據(jù)結(jié)構(gòu)的工作量。在實際工作中,我們經(jīng)常用它來傳遞數(shù)據(jù),不過對于其使用的一些細節(jié)還是需要注意的。在ECMAScript5中定義了原生的JSON對象,可以用來將對象序列化為JSON字符串,或者將JSON數(shù)據(jù)解析為javascript對象。
一、JSON語法
JSON可以用來表示三種類型的值:簡單值、對象和數(shù)組。對象和數(shù)組一般是JSON結(jié)構(gòu)的最外層形式。
1.JSON簡單值
可以在JSON中表示字符串、數(shù)值、布爾值、null。
例如:
5//數(shù)值類型"hello json"//字符串類型注意:
①JSON不支持js中的特殊值undefined;
②JSON字符串必須使用雙引號,不能使用單引號。
③在實際應(yīng)用中,JSON一般用來表示較復(fù)雜的數(shù)據(jù)結(jié)構(gòu),而簡單值一般用作復(fù)雜數(shù)據(jù)結(jié)構(gòu)中的一部分。
2.對象
JSON對象與JavaScript對象字面量對象的語法是類似的。
//JavaScript對象字面量表示 var jsWeatherinfo={city:"北京",cityid:"101010100",weather:"多云轉(zhuǎn)晴" //JSON對象 {"city":"北京","cityid":"101010100","weather":"多云轉(zhuǎn)晴" }但是有幾點不同:
①JSON中沒有變量的概念,所以沒有聲明變量;
②JSON末尾沒有分號;
③JSON對象中的屬性名一定要使用雙引號,而JavaScript對象中的屬性引號是可有可無的。
3.數(shù)組
JSON數(shù)組采用的是javascript的數(shù)組字面量形式.
//JavaScript數(shù)組var result=[1,true,"today"];//JSON數(shù)組 [1,true,"today"]區(qū)別:JSON數(shù)組沒有末尾的分號,也沒有聲明變量.
二、JSON序列化
1.JSON對象
JavaScript的eval()函數(shù)可以用來解析JSON并返回JavaScript對象,不過eval()對JSON結(jié)構(gòu)求值是存在風(fēng)險的.因此,在ECMAScript5中新增了全局的JSON對象.JSON對象有兩個方法:stringify()和parse().
stringify()用于把JavaScript對象序列化為JSON字符串;
parse()用于把JSON字符串解析為原生的JavaScript值.
var weather={ 'city': '北京', 'cityid': '101010100', 'temp1': '31℃', 'temp2': '20℃', 'weather': '多云轉(zhuǎn)晴', 'img1': 'd1.gif', 'img2': 'n0.gif', 'ptime': '11:00' }; var text=JSON.stringify(weather); var json=JSON.parse(text); json.weather;//"多云轉(zhuǎn)晴"?
2.JSON.stringify()
JSON.stringify()方法有三個參數(shù):
第一個參數(shù)是要序列化的JavaScript對象;
第二個參數(shù)是過濾器,可以是一個數(shù)組或者函數(shù);
第三個參數(shù)是一個布爾值,表示是否在JSON字符串中保留縮進.
①過濾器
如果過濾器參數(shù)是數(shù)組,那么stringify()結(jié)果中只包含該數(shù)組中列出的屬性.
var weather={ 'city': '北京', 'cityid': '101010100', 'temp1': '31℃', 'temp2': '20℃', 'weather': '多云轉(zhuǎn)晴', 'img1': 'd1.gif', 'img2': 'n0.gif', 'ptime': '11:00' }; var text=JSON.stringify(weather,["city","weather","temp1","temp2"]); //結(jié)果:"{"city":"北京","weather":"多云轉(zhuǎn)晴","temp1":"31℃","temp2":"20℃"}"如果過濾器是函數(shù),傳入的函數(shù)有兩個參數(shù):屬性名和屬性值.根據(jù)屬性名來判斷如何處理序列化對象中相應(yīng)的屬性.如果函數(shù)返回了undefined,那么相應(yīng)的屬性就會被忽略.
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; } }); //結(jié)果:"{"city":"北京","cityid":"101010100","temp1":"最高溫度31℃","temp2":"最低溫度20℃","weather":"多云轉(zhuǎn)晴"}"③字符串縮進
JSON.stringify()第三個參數(shù)用來控制結(jié)果中的縮進情況.
如果縮進參數(shù)傳入的是數(shù)值,表示每個json字段縮進的空格數(shù),但是最大縮進空格數(shù)不超過10.
var text2=JSON.stringify(weather,null,5)如果縮進參數(shù)傳入的是字符串,則表示JSON字符串中每個級別都使用該字符串作為縮進字符.不過該字符串也不能超過10個字符長.
var text3=JSON.stringify(weather,null,"--")④toJSON()方法
如果JSON.stringify()不能滿足某些對象的序列化需求,可以給對象自定義toJSON方法,返回其自身的JSON數(shù)據(jù)格式。
var weather={ 'city': '北京', 'cityid': '101010100', 'temp1': '31℃', 'temp2': '20℃', 'weather': '多云轉(zhuǎn)晴',toJSON:function(){return this.city+this.weather+",最高溫度"+this.temp1+",最低溫度"+this.temp2;} }; JSON.stringify(weather);//""北京多云轉(zhuǎn)晴,最高溫度31℃,最低溫度20℃""綜合以上幾種情況,JSON.stringify()序列化對象的順序如下:
①如果對象存在toJSON方法且能返回有效值,則調(diào)用該方法;否則,仍然按照默認順序執(zhí)行序列化。
②如果stringify()存在第二個參數(shù),應(yīng)用這個過濾器;
③對第②步返回的每個值進行序列化;
④如果存在第三個參數(shù),執(zhí)行相應(yīng)的格式化。
三、JSON解析
JSON.parse()用來將JSON字符串解析成JavaScript對象。
該方法第一個參數(shù)要解析的JSON字符串;
第二個參數(shù)是一個函數(shù)還原函數(shù)。還原函數(shù)有兩個參數(shù)key和value。如果還原函數(shù)返回undefined,則表示將該屬性從結(jié)果中刪除;如果返回其它值,則將該值插入到結(jié)果當(dāng)中。在將日期字符串轉(zhuǎn)換為Date對象時,經(jīng)常用到還原函數(shù).
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;} });?
總結(jié)
以上是生活随笔為你收集整理的读javascript高级程序设计13-JSON的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 思恋一个荒废的名字89个
- 下一篇: gradle idea java ssm