一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - PHP教程 - php和js如何通過json互相傳遞數據相關問題探討

php和js如何通過json互相傳遞數據相關問題探討

2020-03-12 12:36PHP教程網 PHP教程

json是js的一種數據格式,可以直接被js解析,php無法直接讀取json數據,但是php提供了json_decode函數來對json數據進行轉化,從而可以被php腳本訪問,今天,站長就和大家一起來探討這個問題,感興趣的你可以參考下哦

當我們在結合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函數對其編碼,如: 

復制代碼代碼如下:


<a href="javascript:show('<?php echo urlencode(json_encode(array('1','2','3')));?>')" id="aj">訪問json</a> 


我們可以用下面的js代碼來驗證: 

復制代碼代碼如下:


function show(str){ 
var 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訪問呢?我們不防試一試: 

復制代碼代碼如下:


<a href="javascript:show('<?php echo urlencode(json_encode(array('a'=>'1','b'=>'2','c'=>'3')));?>')" id="aj">訪問json</a> 
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.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格式非常重要。有了上面的例子做鋪墊,下面站長就直接給出示例代碼: 

復制代碼代碼如下:


<a href="javascript:show('<?php echo urlencode(json_encode(array(array('1','2','3'))));?>')" id="aj">訪問json</a> 
function show(str){ 
var jobj=eval_r(decodeURI(str)); 
alert(jobj[0][0]); 


大家運行,會發現,這跟一維數組差不多,這是不帶鍵名的例子,因此在show函數中,去掉字符串兩端的括號也是可以的。 
下面,我們對二維數組進行一下變化,在第二維中加入鍵名,請看示例代碼: 

復制代碼代碼如下:


<a href="javascript:show('<?php echo urlencode(json_encode(array(array("a"=>'1',"b"=>'2','3'))));?>')" id="aj">訪問json</a> 
function show(str){ 
var jobj=eval_r('('+decodeURI(str)+')'); 
alert(jobj[0].a); 


大家運行代碼后,發現,這里我們訪問json數據的方式有點不一樣。上面我們用的是 
alert(jobj[0][0]); 
而這里我們用的是 
alert(jobj[0].a);不要問我為什么,就是這樣。這就是json的訪問方式。 
上面的例子,我們對二維數組的第二維添加了鍵名,下面我們對第一維添加鍵名,看看訪問方式又有什么不同: 

復制代碼代碼如下:


<a href="javascript:show('<?php echo urlencode(json_encode(array('k'=>array('1','2','3'))));?>')" id="aj">訪問json</a> 
function show(str){ 
var jobj=eval_r('('+decodeURI(str)+')'); 
alert(jobj.k[1]); 


這里我們使用的是 
jobj.k[1]這樣的方式,大家一定已經發現了,只要數組中含有鍵名,當數組被轉化為json格式后,就要使用 
json對象.鍵名 
這樣的方式來訪問該鍵下的元素,上面的例子中,k鍵下的數組元素是數字索引,所以在json中使用k[1]這樣的方式來訪問。 
下面,我們對數組的第一維和第二維都添加鍵名: 

復制代碼代碼如下:


<a href="javascript:show('<?php echo urlencode(json_encode(array('k'=>array("a"=>'1','2','3'))));?>')" id="aj">訪問json</a> 
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向js傳遞json字符串時,需要注意的事項。下面我們再來討論,用js向php傳遞json字符串時需要如何處理。 
聰明的你肯定已經知道了,只要將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。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 四虎永久| 日本欧美不卡一区二区三区在线 | 国产欧美日韩在线播放 | 久久精品在现线观看免费15 | 好男人资源在线观看免费的 | 俄罗斯处女摘花 | 果冻传媒在线播放观看w | 国产成人精选免费视频 | 国产成人欧美视频在线 | 国精视频一区二区视频 | 天天干天天爽天天操 | 国产一区二区三区福利 | 成人黄页网站 | 色男人的天堂久久综合 | 午夜精品久视频在线观看 | 国产精品秒播无毒不卡 | 亚洲电影不卡 | xvideoscom极品肌肉警察 | 国产福利在线免费观看 | 久久丫线这里只精品 | 亚洲情射| 欧美日韩久久中文字幕 | 久久视频在线视频观看天天看视频 | 国产精品久久国产三级国电话系列 | 日本免费高清在线观看播放 | 久久久久伊人 | china中国小帅gayxnxx | 国产精品免费综合一区视频 | 国产精品福利久久2020 | 热99re久久精品国产首页 | 欧亚精品一区二区三区 | 亚洲欧美日韩国产精品一区 | 韩剧网3600热播剧 | 欧美国产日本精品一区二区三区 | 精品亚洲视频在线观看 | 动漫女性扒开尿口羞羞漫画 | 日本妇人成熟免费观看18 | 91日本在线观看亚洲精品 | 久久99r66热这里有精品 | 四虎 2022 永久网站 | 韩国理论片最新第一页 |