瀏覽量:71次
本節(jié)重點(diǎn)來(lái)介紹一下JSON,JSON(JavaScript Object Notation) 是一種輕量級(jí)的數(shù)據(jù)交換格式,我們稱之為JavaScript對(duì)象表示法。也就是說(shuō),JSON是一種格式。首先搞清楚三個(gè)概念,即什么是JSON字符串,什么是JavaScript對(duì)象,還有什么又叫做JSON對(duì)象?先來(lái)說(shuō)一個(gè)事,在沒(méi)有JSON之前,前臺(tái)頁(yè)面和Java等語(yǔ)言充當(dāng)?shù)姆?wù)器層,到底是如何傳輸數(shù)據(jù)的呢?沒(méi)錯(cuò),是通過(guò)XML來(lái)傳輸?shù)摹1热缫粋€(gè)登陸頁(yè)面。
頁(yè)面上有用戶名和密碼兩個(gè)輸入框,當(dāng)我點(diǎn)擊登錄按鈕,這兩個(gè)數(shù)據(jù)就會(huì)被傳遞到服務(wù)器層。那么,如何傳輸呢?如果用XML,也許是這樣的:
zhangsan123
后臺(tái)接收到這個(gè)數(shù)據(jù),然后就可以開(kāi)始解析,最終拿到zhangsan和123兩個(gè)字面量。時(shí)間線再往前推,在XML還沒(méi)有出來(lái)的時(shí)候,怎么辦呢?聰明的程序開(kāi)發(fā)人員則會(huì)規(guī)定幾種特殊的格式,拼接一個(gè)特殊的字符串,傳遞到后臺(tái)中去。比如像這樣的:
"name=zhangsan&password=123"
那么后臺(tái)的程序員也知道這個(gè)規(guī)則,如果是Java的話,就可以使用String的splite方法,先通過(guò)逗號(hào)把這個(gè)字符串分割成兩份,也就是變成:name=zhangsan還有password=123兩個(gè)字符串,然后再通過(guò)“=”分割,將“name=zhangsan”分割成“name”和“zhangsan”,把“password=123”分割成“password”和“123”兩部分。終于,到底還是拿到用戶名和密碼了。
接下來(lái)還是談JSON,其實(shí)JSON就是一種數(shù)據(jù)格式。諸如:
{key1:value1,key2:value2};這樣的格式就是JSON格式,它是一系列鍵值對(duì)的集合,不同的鍵值對(duì)之間用逗號(hào)分隔,最后一個(gè)鍵值對(duì)不需要加逗號(hào)。符合這種格式的字符串就是JSON字符串。比如:
"{'name':'Jack'}"它歸根到底還是一個(gè)字符串,不是一個(gè)對(duì)象。而JSON對(duì)象,其實(shí)就是Javascript對(duì)象,我們可以通過(guò)字面值的方式直接創(chuàng)造一個(gè)對(duì)象,比如:
varperson={name:'Jack'}等同于:
varperson={'name':'Jack'}在上邊這個(gè)例子中,name可加單引號(hào),也可加雙引號(hào),甚至可以什么都不加。而右邊的值必須是一個(gè)實(shí)實(shí)在在的東西,比如字符串,或者一個(gè)對(duì)象,甚至是一個(gè)函數(shù)。我們不考慮JS內(nèi)部的對(duì)象機(jī)制,只是簡(jiǎn)單地說(shuō)明一下,是有這么個(gè)事情的。這就是所謂的JSON對(duì)象,也就是js對(duì)象。在JavaScript中,對(duì)象是鍵值對(duì)的集合,符合JSON格式。我們可以通過(guò)下面的方法,把JS對(duì)象轉(zhuǎn)換成JSON格式的字符串。
varperson={'name':'Jack'}alert((person));同樣,一個(gè)JSON格式的字符串,可以變成一個(gè)JS對(duì)象,如:
(("{\"name\":\"Jack\"}"));做個(gè)小結(jié),JSON字符串就是符合JSON格式的字符串,他還是字符串,JSON對(duì)象就是JavaScript對(duì)象,我們推薦使用字面值的方式來(lái)創(chuàng)建一個(gè)JS對(duì)象。然后,JS對(duì)象和JSON字符串可以互相轉(zhuǎn)換。通過(guò)這一個(gè)特點(diǎn),我們能夠?qū)崿F(xiàn)JS對(duì)象的拷貝。一般來(lái)說(shuō),比如我有一個(gè)js對(duì)象。
varperson={'name':'Jack'}varperson2=person;這樣做,并不是對(duì)象的復(fù)制,person2僅僅是一個(gè)指針,他和person一樣,指向了{(lán)'name' : 'Jack'}這一片內(nèi)存空間。當(dāng)person發(fā)生改變,person2必然也跟著改變。
varperson={'name':'Jack'}varperson2=person;=10;//給person動(dòng)態(tài)地添加一個(gè)屬性alert((person2));//person2也跟著變了那有沒(méi)有什么辦法可以實(shí)現(xiàn)對(duì)象的復(fù)制呢?一個(gè)好的解決方案就是,先把person轉(zhuǎn)換成JSON字符串,然后再轉(zhuǎn)成JS對(duì)象,這個(gè)時(shí)候就是另外一個(gè)JS對(duì)象了。比如:
varperson={'name':'Jack'}varperson2=((person));=10;//給person動(dòng)態(tài)地添加一個(gè)屬性alert((person2));//person2不變接下來(lái)說(shuō)說(shuō)js對(duì)象內(nèi)容的訪問(wèn)和操作,我們上面已經(jīng)說(shuō)了,JS對(duì)象中無(wú)非是一些鍵值對(duì)的集合,他更像是一個(gè)容器,既然是容器,自然有內(nèi)容,我們?nèi)绾卧L問(wèn)其中的內(nèi)容呢?在上面的例子中,我們已經(jīng)通過(guò)“”的方式來(lái)訪問(wèn)JS對(duì)象的具體內(nèi)容。比如:
varobj={id:1};varid=;alert(id);另外一種方式,就是通過(guò) 對(duì)象["屬性名"] 來(lái)操作其內(nèi)容。比如:
varid=obj['id']可以用雙引號(hào),也可以用單引號(hào),看個(gè)人習(xí)慣了。在JS對(duì)象中,屬性名永遠(yuǎn)都是字符串,雖然諸如這樣的代碼:
varobj={id:1};id沒(méi)有加上引號(hào),但它實(shí)際上還是以字符串的形式被保存起來(lái)的。再說(shuō)一遍,如果你要訪問(wèn)和操作JS對(duì)象的內(nèi)容,有兩種方式,第一種方式是用點(diǎn),第二種方式則是用中括號(hào)。兩種方式如果做一個(gè)比較,顯然是第二種方式較為靈活,因?yàn)樗怯米址フ覍?duì)應(yīng)的鍵值對(duì),而不是用一個(gè)標(biāo)識(shí)符。比如剛才的例子,你這樣寫:
varid=;我問(wèn)你,?為了符合規(guī)范,id必須是標(biāo)識(shí)符,你不能寫 吧。這顯然是不合法,也無(wú)法運(yùn)行通過(guò)的。比如,你能這樣寫嗎?
varobj={123:'HelloJavaScript!'};varid=;alert(id);肯定不行,會(huì)報(bào)錯(cuò)的:
但是,如果你用中括號(hào)就可以:
varobj={123:'HelloJavaScript!'};varid=obj['123'];alert(id);具體用那種方式,隨你喜好而定。
現(xiàn)在,我們已經(jīng)對(duì)JSON格式和JS對(duì)象有了一個(gè)比較充分的了解,我要在此拋出一個(gè)問(wèn)題,有沒(méi)有什么辦法能夠獲取JS對(duì)象的屬性詳情呢?注意我的用詞,是屬性詳情,也就是說(shuō),比如有一個(gè)JS對(duì)象:
varobj={message:'HelloJavaScript!'};message就是它的屬性,關(guān)于這個(gè)屬性,有沒(méi)有什么詳細(xì)的描述信息呢?答案是有的,在JS中,有一個(gè)內(nèi)置的Object對(duì)象,它給我們提供了一個(gè)getOwnPropertyDescriptor方法,可以看到某個(gè)對(duì)象的某個(gè)屬性的具體情況。你可以把這個(gè)理解為Java中的靜態(tài)類調(diào)用方法。我們可以這樣做:
varobj={message:'HelloJavaScript!'};((obj,'message'));
可以看到,我們成功挖掘出了四個(gè)屬性,如果你不明白我在說(shuō)什么,我就說(shuō)得更加直白一些,就是說(shuō),
varobj={message:'HelloJavaScript!'};obj里面有一個(gè)屬性message,而message又有四個(gè)描述性的東西,分別是configurable(可配置),enumerable(可枚舉),value(值),還有 writable(可寫入)。這四樣?xùn)|西,專業(yè)術(shù)語(yǔ)叫做屬性描述符,或者數(shù)據(jù)描述符。目前我們看到的數(shù)據(jù)描述符都被賦予了默認(rèn)值,我們也可以通過(guò)defineProperty方法對(duì)其進(jìn)行個(gè)性化配置。
比如,我們把message設(shè)置為只讀:
varobj={message:'HelloJavaScript!'};((obj,'message'));(obj,'message',{writable:false});='haha';alert();不好意思,修改無(wú)效,因?yàn)槲乙呀?jīng)把這個(gè)屬性設(shè)置為只讀了。在嚴(yán)格模式下,甚至?xí)?bào)錯(cuò),啥,你問(wèn)我什么叫做嚴(yán)格模式?好吧,其實(shí)就是一句話的事。
這就是嚴(yán)格模式,你不要問(wèn)為什么這樣就行了,我不會(huì)告訴你,因?yàn)槲乙膊欢?。我只知道,這樣寫就可以,于是乎,接下來(lái)運(yùn)行就報(bào)錯(cuò)了。
本文就介紹到這里,對(duì)JSON進(jìn)行了一個(gè)簡(jiǎn)單的說(shuō)明。至于深入的學(xué)習(xí),還請(qǐng)各位自行去百度吧。
[聲明]本網(wǎng)轉(zhuǎn)載網(wǎng)絡(luò)媒體稿件是為了傳播更多的信息,此類稿件不代表本網(wǎng)觀點(diǎn),本網(wǎng)不承擔(dān)此類稿件侵權(quán)行為的連帶責(zé)任。故此,如果您發(fā)現(xiàn)本網(wǎng)站的內(nèi)容侵犯了您的版權(quán),請(qǐng)您的相關(guān)內(nèi)容發(fā)至此郵箱【779898168@qq.com】,我們?cè)诖_認(rèn)后,會(huì)立即刪除,保證您的版權(quán)。
官網(wǎng)優(yōu)化
整站優(yōu)化
渠道代理
400-655-5776