首頁  >  文章  >  後端開發  >  php和js如何透過json互相傳遞資料相關問題探討

php和js如何透過json互相傳遞資料相關問題探討

高洛峰
高洛峰原創
2016-12-01 15:01:281134瀏覽

當我們在結合php和javascript實現某些功能時,常常會用到json。 json是js的一種資料格式,可以直接被js解析。而php無法直接讀取json數據,但是php提供了json_decode函數來對json資料進行轉化,因此可以被php腳本存取。同時,php也提供了json_encode函數來將資料轉換成json格式。那麼,js中的原生json與php中透過json_encode函數轉換後的json是否完全一樣呢?今天,站長就和大家一起來探討這個問題。

我們透過php傳遞陣列資料到javascript時,通常要將其轉換為json格式,一遍javascript來獲取,那麼我們就以陣列為例,先來看兩者之間的差異。

1、一維陣列 
考慮php陣列 
複製程式碼 程式碼如下: 
$array=array("1","2","3"); 

使用json_encode函數轉換後,對應的json字串為
複製代碼 代碼如下: 
["1","2","3"]。 

細心的朋友很快就發現,轉換後得到的json字串,就是javascript中的陣列形式,那麼是否可以用js的陣列存取方式來存取呢?
當然是可以的,但是你將這個json字串傳遞給給js時,需要使用urlencode函數對其編碼,如: 
複製代碼 代碼如下: 
 
我們可以用下面的js程式碼來驗證: 
複製程式碼 程式碼如下: 
function show(str){ 
var jobj=eval_r(decodeURI(str)); 
alert(jobj=eval_r(decodeURI(str)); 
alert(jobj[2]);

大家自己試試看就會發現,是的,可以用js中存取一維數組的方式來存取它。 eval方法將json字串解釋為json對象,因為傳遞過來的是字串,不轉化的話,你得到將是字串中第三個字元的值。
我們再來對這個一維數組做一下變化,我們發現上面的一維數組沒有指定索引,所以它默認為數字索引,現在我們來給它加上鍵名: 
考慮php數組 
複製代碼 代碼如下:
$array=array('a'=>'1','b'=>'2','c'=>'3'); 

使用json_encode函數轉換後,對應的json字串為 
複製代碼 代碼如下: 
{"a":"1","b":"2","c":"3"} 

。 
我們很快就發現了其中的不同,最明顯的就是字符串兩端的[]變成了{},那麼這個字符串是否也可以按上面那樣處理後被js訪問呢?我們不防試試: 
複製程式碼 程式碼如下: 
function show(str){ 
var jobj=eval_r(decodeURI(str)); 
alert(jobj.a); 


大家如果動手試了就知道,點擊連結後,沒有出現彈窗。為什麼呢?是PHP產生的json字串格式不對嗎?不是的,這是我們在使用eval函數解釋的時候,出錯了。把上面的函數碼換成: 
複製程式碼 程式碼如下: 
function show(str){ 
var jobj=eval_r('('+decodeURI(str)+')'); 
alert(jobj.acodeURI(str)+')'); 
alert(jobj.a); } 

再試試吧!怎麼樣,可以訪問了吧。這告訴我們,在使用eval方法處理帶有鍵名的json字串時,需要在字串兩端加速括號。至於為什麼,站長也不知道,站在巨人的肩膀上而已。
這裡要注意,儘管PHP產生的json字串 
{"a":"1","b":"2","c":"3"}傳遞給js後無法直接解釋為json格式,但是如果你在js中使用該字串直接建立json數據,是可以的。試試看下面的程式碼: 
複製程式碼 程式碼如下: 
var jobj={"a":"1","b":"2","c":"3"}; 
alert(jobj.b) ; 

2、二維數組 
二維數組在PHP用的應用非常廣泛,因此了解二維數組轉換後的json格式非常重要。有了上面的例子做鋪墊,下面站長就直接給出範例程式碼: 
複製程式碼 程式碼如下: 
function show(str){ 
var jobj=eval_r(decodeURI(str)); 
alert(jobj[0][0]); 


大家運行,會發現,這跟一維數組差不多,這是不帶鍵名的例子,因此在show函數中,去掉字串兩端的括號也是可以的。
下面,我們對二維數組進行一下變化,在第二維中加入鍵名,請看示例代碼: 
複製代碼 代碼如下: 
function show(str){ 
var jobj=eval_r('('+decodeURI(str)+')'); 
alert(jobj[0].a); 


大家執行程式碼後,發現,這裡我們存取json資料的方式有點不不一樣一樣。上面我們用的是 
alert(jobj[0][0]); 
而這裡我們用的是 
alert(jobj[0].a);不要問我為什麼,就是這樣。這就是json的訪問方式。
上面的例子,我們對二維數組的第二維添加了鍵名,下面我們對第一維添加鍵名,看看訪問方式又有什麼不同: 
複製代碼 代碼如下: 
function show(str){ 
var jobj=eval_r('('+decodeURI(str)+')'); 
alert(jobj.k[1]); 


這裡我們使用的是 
jobj.k[1]這樣的方式,大家一定已經發現了,只要數組中含有鍵名,當數組被轉換為json格式後,就要使用 
json對象.鍵名
這樣的方式來存取該鍵下的元素,在上面的例子中,k鍵下的陣列元素是數字索引,所以在json中使用k[1]這樣的方式來存取。
下面,我們對陣列的第一維和第二維都加上鍵名: 
複製程式碼 程式碼如下: 
function show(str){ 
var jobj=eval_r('('+decodeURI(str)+')'); 
alert(jobj.k.a); 


正如上面所提到的,只要含有鍵名,就必須以 
json對象.鍵名 
的方式來訪問,如果有多個鍵就要用 
json對象.鍵名.鍵名... 
,不要問我為什麼,這就是json的訪問方式,只有javascript的發明者能向你解釋,他為什麼要這樣規定。 
結論: 
1、將php中的陣列轉換成json字串傳給js時。如果陣列沒有指定鍵名,那麼可以直接使用js的eval方法將其轉換為json格式供js處理;如果陣列中含有鍵名,那麼在使用eval方法處理時,需要使用 
() 
將json字串括起來。
2、如果數組含有鍵名,轉換為json字串後,在js中要用 
json物件.鍵名.鍵名... 
的方式來訪問,如果是數字索引則用 
json物件[ 1] 
或 
json物件.鍵名[1] 
這樣的方式。 
上面,我們主要討論了,在PHP傳遞json字串時,需要注意的事項。下面我們再來討論,用js傳遞json字串時需要如何處理給php。 
聰明的你一定已經知道了,只要將json資料用引號引起來作為字串傳遞給PHP【通常用ajax進行】就可以用json_decode函數解碼了。沒錯!就是這樣!但在建構json字串的時候一定要仔細,如果你不常建構json字串,那麼不妨用 
echo json_encode(array('k'=>array("a"=>'1','2', '3'))) 
這樣的方式,查看你需要建構的目標字串的json格式。這樣你就可以在js中根據你想要的結果來建構了! 
好了,今天對php和js之間如何使用json資料進行通信就討論到這裡,大家可以自己再試試將php的物件類型進行json編碼後如何傳遞給js。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn