- 作(zuò)者:admin
- 發表時(shí)間(jiān):2013-07-02 14:17:26
- 來(lái)源:未知
互聯網的今天,AJAX已經不是什麽陌生(shēng)的詞彙了。說起AJAX,可(kě)能會(huì)立即想起因RSS而興起的XML。XML的解析,恐怕已經不是什麽難題了,特别是PHP5,大(dà)量的XML解析器(qì)的湧現,如最輕量級的SimpleXML。不過對于AJAX來(lái)說,XML的解析更傾向于前台Javascript的支持度。我想所有(yǒu)解析過XML的人(rén),都會(huì)因樹(shù)和(hé)節點而頭大(dà)。不可(kě)否認,XML是很(hěn)不錯的數(shù)據存儲方式,但(dàn)是其靈活恰恰造成了其解析的困難。當然,這裏所指的困難,是相對于本文的主角--JSON而言。
JSON為(wèi)何物?我就不重複概念了。通(tōng)俗的說,它是一種數(shù)據的存儲格式,就像PHP序列化後的字符串一樣。它是一種數(shù)據描述。比如我們将一個(gè)數(shù)組序列化後存放,就可(kě)以很(hěn)容易的反序列化後應用。JSON也是如此,隻不過他搭建的是客戶端Javascript和(hé)服務端PHP的交互橋梁。我們用PHP生(shēng)成JSON後的字符串,然後把這個(gè)字符串傳給前台Javascript,Javascirpt就可(kě)以很(hěn)容易的将其反JSON然後應用。說通(tōng)俗點,它真的很(hěn)像數(shù)組。
言歸正傳,如何使用JSON。PHP5.2開(kāi)始內(nèi)置了JSON的支持。當然,如果低(dī)于這個(gè)版本的話(huà),那(nà)麽市面上(shàng)有(yǒu)很(hěn)多(duō)PHP版本的實現,随便下一個(gè)用就OK啦。現在主要是說說PHP內(nèi)置支持的JSON。很(hěn)簡單,兩個(gè)函數(shù):json_encode和(hé)json_decode(跟序列化很(hěn)像啦)。一個(gè)編碼,一個(gè)解碼。先看看編碼的使用:
'陳毅鑫', 'nick' => '深空(kōng)', 'contact' => array( 'email' => 'shenkong at qq dot com', 'website' => 'http://www.chinaz.com', ) ); $json_string = json_encode($arr); echo $json_string; ?>
很(hěn)簡單的将一個(gè)數(shù)組JSON了。需要指出的是,在非UTF-8編碼下,中文字符将不可(kě)被encode,結果會(huì)出來(lái)空(kōng)值,所以,如果你(nǐ)使用gb2312編寫PHP代碼,那(nà)麽就需要将包含中文的內(nèi)容使用iconv或者mb轉為(wèi)UTF-8再進行(xíng)json_encode,上(shàng)面輸出結果如下:
{"name":"\u9648\u6bc5\u946b","nick":"\u6df1\u7a7a", "contact":{"email":"shenkong at qq dot com","website":"http:\/\/www.chinaz.com"}}
我都說了和(hé)序列化很(hěn)像,你(nǐ)還(hái)不信。編碼後就要解碼,PHP提供了相應的函數(shù)json_decode,json_decode執行(xíng)後,将會(huì)得(de)到一個(gè)對象,操作(zuò)如下:
'陳毅鑫', 'nick' => '深空(kōng)', 'contact' => array( 'email' => 'shenkong at qq dot com', 'website' => 'http://www.chinaz.com', ) ); $json_string = json_encode($arr); $obj = json_decode($json_string); print_r($obj); ?>
訪問對象內(nèi)的屬性會(huì)吧(ba)?$obj->name,這樣子的,當然,也可(kě)以把它轉位數(shù)組,方便調用啦:
$json_string = json_encode($arr); $obj = json_decode($json_string); $arr = array($obj); print_r($arr);
PHP轉來(lái)轉去的用途不是特别大(dà),除了緩存生(shēng)成,感覺還(hái)不如直接存數(shù)組呢,不過,當你(nǐ)和(hé)前台交互的時(shí)候,它的作(zuò)用就出來(lái)咯,下面看看我怎麽用Javascript來(lái)使用這段字符:
上(shàng)面中,直接将這個(gè)字符串賦給一個(gè)變量,它就變成一個(gè)Javascript數(shù)組了(專業化術(shù)語應該不叫數(shù)組,不過由于PHP的習慣問題,我就一直叫數(shù)組好了,方便理(lǐ)解)。這樣,可(kě)以很(hěn)方便的對arr進行(xíng)遍曆或者任意做(zuò)你(nǐ)想做(zuò)的事情了。寫到這裏,好像都沒提到AJAX哦?是哦,聯想一下,如果服務端返回的responseText用JSON過的字符串代替XML的話(huà),前台Javascript處理(lǐ)起來(lái)是不是很(hěn)方便呢?狗皮膏藥就是這樣用的。
其實寫到這裏,除了數(shù)據的存儲格式不太一樣外,JSON和(hé)XML也沒什麽太大(dà)區(qū)别哦,不過下面我說的一點。雖然和(hé)XML沒多(duō)大(dà)關系,不過,可(kě)以說明(míng)JSON更大(dà)範圍的應用,那(nà)就是,跨域的數(shù)據調用。由于安全性問題,AJAX不支持跨域調用,這樣要調用不同域名下的數(shù)據,很(hěn)麻煩哦,雖然有(yǒu)解決方案(stone在他的講座上(shàng)提到過了代理(lǐ)啊什麽的雖然聽(tīng)不懂但(dàn)是知道(dào)能解決)。我寫兩個(gè)文件,足以展示跨域調用了。
主調文件index.html
被調文件profile.php
'陳毅鑫', 'nick' => '深空(kōng)', 'contact' => array( 'email' => 'shenkong at qq dot com', 'website' => 'http://www.chinaz.com', ) ); $json_string = json_encode($arr); echo "getProfile($json_string)"; ?>
很(hěn)顯然,當index.html調用profile.php時(shí),JSON字符串生(shēng)成,并作(zuò)為(wèi)參數(shù)傳入getProfile,然後将昵稱插入到div中,這樣一次跨域數(shù)據交互就完成了,是不是特别簡單。既然JSON這麽簡單易用而且好用,還(hái)等什麽呢?