天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

php和js如何通過json互相傳遞數(shù)據(jù)相關(guān)問題探討

當我們在結(jié)合phpJavascript實現(xiàn)某些功能時,經(jīng)常會用到j(luò)son。json是js的一種數(shù)據(jù)格式,可以直接被js解析。而php無法直接讀取json數(shù)據(jù),但是php提供了json_decode函數(shù)來對json數(shù)據(jù)進行轉(zhuǎn)化,從而可以被php腳本訪問。同時,php也提供了json_encode函數(shù)來將數(shù)據(jù)轉(zhuǎn)化成json格式。那么,js中的原生json與php中通過json_encode函數(shù)轉(zhuǎn)化后的json是否完全一樣呢?今天,站長就和大家一起來探討這個問題。

我們通過phpJavascript傳遞數(shù)組數(shù)據(jù)時,通常要將其轉(zhuǎn)化為json格式,一遍Javascript來獲取,那么我們就以數(shù)組為例,先來看一下兩者之間的區(qū)別。

1、一維數(shù)組
考慮php數(shù)組
復制代碼 代碼如下:
$array=array("1","2","3");

使用json_encode函數(shù)轉(zhuǎn)化后,對應(yīng)的json字符串為
復制代碼 代碼如下:
["1","2","3"]。

細心的朋友很快就發(fā)現(xiàn),轉(zhuǎn)化后得到的json字符串,就是Javascript中的數(shù)組形式,那么是否可以用js的數(shù)組訪問方式來訪問呢?
當然是可以的,但是你將這個json字符串傳遞給給js時,需要使用urlencode函數(shù)對其編碼,如:
復制代碼 代碼如下:
<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]);
}

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

使用json_encode函數(shù)轉(zhuǎn)化后,對應(yīng)的json字符串為
復制代碼 代碼如下:
{"a":"1","b":"2","c":"3"}

。
我們很快就發(fā)現(xiàn)了其中的不同,最明顯的就是字符串兩端的[]變成了{},那么這個字符串是否也可以按上面那樣處理后被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);
}

大家如果動手試了就知道,點擊鏈接后,沒有出現(xiàn)彈窗。為什么呢?是php生成的json字符串格式不對嗎?不是的,這是我們在使用eval函數(shù)解釋的時候,出錯了。把上面的函數(shù)代碼換成:
復制代碼 代碼如下:
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中使用該字符串直接創(chuàng)建json數(shù)據(jù),是可以的。試試下面的代碼吧:
復制代碼 代碼如下:
var jobj={"a":"1","b":"2","c":"3"};
alert(jobj.b);

2、二維數(shù)組
二維數(shù)組在php用的應(yīng)用非常廣泛,因此了解二維數(shù)組轉(zhuǎn)化后的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]);
}

大家運行,會發(fā)現(xiàn),這跟一維數(shù)組差不多,這是不帶鍵名的例子,因此在show函數(shù)中,去掉字符串兩端的括號也是可以的。
下面,我們對二維數(shù)組進行一下變化,在第二維中加入鍵名,請看示例代碼:
復制代碼 代碼如下:
<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);
}

大家運行代碼后,發(fā)現(xiàn),這里我們訪問json數(shù)據(jù)的方式有點不一樣。上面我們用的是
alert(jobj[0][0]);
而這里我們用的是
alert(jobj[0].a);不要問我為什么,就是這樣。這就是json的訪問方式。
上面的例子,我們對二維數(shù)組的第二維添加了鍵名,下面我們對第一維添加鍵名,看看訪問方式又有什么不同:
復制代碼 代碼如下:
<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]這樣的方式,大家一定已經(jīng)發(fā)現(xiàn)了,只要數(shù)組中含有鍵名,當數(shù)組被轉(zhuǎn)化為json格式后,就要使用
json對象.鍵名
這樣的方式來訪問該鍵下的元素,上面的例子中,k鍵下的數(shù)組元素是數(shù)字索引,所以在json中使用k[1]這樣的方式來訪問。
下面,我們對數(shù)組的第一維和第二維都添加鍵名:
復制代碼 代碼如下:
<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的發(fā)明者能向你解釋,他為什么要這樣規(guī)定。
結(jié)論:
1、將php中的數(shù)組轉(zhuǎn)化為json字符串傳遞給js時。如果數(shù)組沒有指定鍵名,那么可以直接使用js的eval方法將其轉(zhuǎn)化為json格式供js處理;如果數(shù)組中含有鍵名,那么在使用eval方法處理時,需要使用
()
將json字符串括起來。
2、如果數(shù)組中含有鍵名,轉(zhuǎn)化為json字符串后,在js中要用
json對象.鍵名.鍵名...
的方式來訪問,如果是數(shù)字索引則用
json對象[1]
或者
json對象.鍵名[1]
這樣的方式。
上面,我們主要討論了,在php向js傳遞json字符串時,需要注意的事項。下面我們再來討論,用js向php傳遞json字符串時需要如何處理。
聰明的你肯定已經(jīng)知道了,只要將json數(shù)據(jù)用引號引起來作為字符串傳遞給php【通常用ajax進行】就可以用json_decode函數(shù)解碼了。沒錯!就是這樣!但是在構(gòu)造json字符串的時候一定要仔細,如果你不經(jīng)常構(gòu)造json字符串,那么不妨用
echo json_encode(array('k'=>array("a"=>'1','2','3')))
這樣的方式,查看你需要構(gòu)造的目標字符串的json格式。這樣你就可以在js中根據(jù)你想要的結(jié)果來構(gòu)造了!
好了,今天對php和js之間如何使用json數(shù)據(jù)進行通信就討論到這里,大家可以自己再試試將php的對象類型進行json編碼后如何傳遞給js。

php技術(shù)php和js如何通過json互相傳遞數(shù)據(jù)相關(guān)問題探討,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 日本护士hd| 苍井空教师BD在线观看全集 | 久久re视频这里精品09免费 | 97SE亚洲国产综合自在线不卡 | 国产日韩在线欧美视频 | www.伊人| 海角国精产品一区一区三区糖心 | 免费鲁丝片一级在线观看 | 国产呦精品一区二区三区下载 | 羞羞漫画免费漫画页面在线看漫画秋蝉 | 裸妇厨房风流在线观看 | 国产亚洲一区二区三区啪 | 啪啪做羞羞事小黄文 | 久久久久久人精品免费费看 | 亚洲人成人77777在线播放 | 国产AV无码熟妇人妻麻豆 | 老师在讲桌下边h边讲课 | 欧美怡红院视频一区二区三区 | 91青青草原 | 一品道门免费高清视频 | 最近中文字幕在线看免费完整版 | 美女乱草鲍高清照片 | 国产精品无需播放器 | 国产人妻人伦精品1国产 | 青青青手机视频 | 精品视频在线播放 | 父亲猜女儿在线观看 | 国产野外无码理论片在线观看 | 男人J进入女人P免费狂躁 | 色偷偷成人网免费视频男人的天堂 | 国精产品一区二区三区有限公司 | good神马电影伦理午夜 | 为什么丈夫插我我却喜欢被打着插 | 真人女人无遮挡内谢免费视频% | 中文字幕精品视频在线 | 久久精品亚洲视频 | 久久成人免费观看草草影院 | 国产中的精品AV一区二区 | 中俄两军在日本海等上空战略巡航 | 亚洲 自拍 欧洲 视频二区 | 久久久久99精品成人片三人毛片 |