這篇文章主要介紹了json 和PHP的編碼轉換問題,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
※前提:json與php分別在前後台 相互傳遞資料時可能出現的資料轉換情況處理(主要針對數組):
☆前台代碼:
var arr = {"name":"張偉","age":19}; //此時產生的是json的數組
arr = json.stringify(arr); //此時將arr轉換成 json的字串類型
$.ajax({ type:"post", url:url, data:{arr:arr}, //將轉換成字串類型的json傳遞給php後台,換換成字串類型後可以一次性傳遞多個資料 success:function(res){ console.log(res); } });
☆後台代碼(只傳遞字串時):
map = $_POST['arr']; $map = json_decode($map);//json對象 解碼之後PHP可以使用,但要用json的方法在後台使用$map->name echo $map->name; // 會輸出到res中, 通過consolve.log(res) 可以直接輸出
問題
關於php和json傳遞數組的情況,從後台傳資料到前台有兩種方法:echo,ajaxreturn
$1 第一種方法:
echo ,需要自行進行encode 編碼後輸出json 字串
這時,有兩種情況,一種是返回從前台接收過來的json字串,一種是後台建立新的數組,並且返回前台。
$1.1 後台接收前台資料,並將相同資料返回
$map = $_POST['arr'];//從前台傳遞過來的$map$map = json_decode($map);//json對象 解碼之後給php後台使用.....$map = json_encode($map);//對json數組進行編碼產生json字串echo $map; //輸出$map到前台
$1.2 後台建立程式,並且返回前台
$mapN = json_encode($mapN);//在後台自行建立的數組,在傳遞給前台之前同樣需要進行編碼echo $mapN;
$1.3 前台操作
res = eval("("+res+")");//通過res將從後台傳過來的json字串轉換成數組console.log(res.name);
$2 第二種方法:
ajaxreturn,傳遞數組時不需要encode編碼,預設傳遞的是就是json的字串形式,但在前台需要eval進行轉換,將json字串轉換成數組
這時,有兩種情況,一種是返回從前台接收過來的json字串,一種是後台建立新的數組,並且返回前台。
$2.1 從前台接收程式,並直接從後台返回前台
$map = $_POST['arr'];$map = json_decode($map);//json對象 解碼之後$this->ajaxReturn($map,'json');
$2.2 後台建立程式,並且返回前台
$mapN = array("name"=>"zhangwei");$this->ajaxReturn($mapN,'json');// 此時不需要json_encode() ,前台通過mapN.name 或者mapN['name']輸出
$2.3 前台操作
res = eval("("+res+")");//通過res將從後台傳過來的json字串轉換成數組console.log(res.name);
$3 補充:
echo 和 ajaxreturn 在關於 從後台傳遞資料到前台的區別:
echo 不會替php數組編碼成json傳遞式的格式——json字串類型
ajaxreturn 會自動調用json_encode函數進行編碼
二者相同的地方:
在傳遞json數值到前台之後都需要eval(“(”+res+“)”)進行轉換成json數組,才可以使用
$4 注意:
這裡後台 通過echo或者ajaxreturn都可以返回資料給前台的 success:function(res)
但是返回之後的資料使用方式不同:
一、字串類型:後台通過echo,可以直接輸出字串到前台的res,
二、數群組類型:不論是前台傳過來的json的字串類型數群組類型,還是後台產生的數群組類型,通過ajaxreturn的方式返回到前台的可以通過:數組名['keyname'] 或者 數組名.keyname 的方式調用
小tips:
一、在前台往後面傳json的字串(本身是數組,但在前台通過stringify轉換成json字串),在後台需要json_decode進行解碼,轉換成php可以使用的json數組, 調用方式 數組名->key
二、在後台建立的數組,若通過json_encode 轉換成 json字串,資料傳到前台後,需要通過 res = eval("("+res+")"); 轉換成json數組, 前台調用方式: 數組名['keyname'] 或者 數組名.keyname