javascript和php使用ajax通信传递JSON
JS和PHP直接通信常用ajax完成,以实现js上UI的动态变化。通信使用JSON或者XML传递数据。下面详细描述两者直接JSON字符串的传递。
下面案例是要传递这样的json数据:
{
"bookid": "558a6be36c72a" ,
"resitems": [
{
"res_id": "558a6bff6bd55",
"res_name": "IMG_8421.jpg",
"src_origin": "558a6bff6bd55.jpg",
"src_hd": "558a6bff6bd55_hd_1920_1280.jpg",
"src_sd": "558a6bff6bd55_sd_1024_682.jpg",
"src_td": "558a6bff6bd55_td_300_200.jpg"
},
{
"res_id": "558a6c4a716a2",
"res_name": "IMG_8477.jpg",
"src_origin": "558a6c4a716a2.jpg",
"src_hd": "558a6c4a716a2_hd_1920_1280.jpg",
"src_sd": "558a6c4a716a2_sd_1024_682.jpg",
"src_td": "558a6c4a716a2_td_300_200.jpg"
}
] }
ajax:
首先要熟悉ajax的用法,它是连接浏览器和服务器的桥梁。
一般用法如下:
$.ajax({
type:"POST",
url:"SQLHelper.php",
dataType:'json',
async:false,
data:{'json':jsonStr}
});
其中type的类型可以是GET和POST,url是服务器处理的脚本程序。dataType类型有text,json,xml等等,async通常使用false,data是具体要传递的json字符串,并且给服务器post一个叫做json字段的数据,PHP端可以$_POST['json']就可以获取post过来的数据。如果需要接收返回数据,
var req= $.ajax({
type:"POST",
url:"SQLHelper.php",
dataType:'json',
async:false,
data:{'json':jsonStr}
});
var response=req.responseText;
上面使用ajax实现了一次普通的客户端到服务器的一次数据传递。下面的问题是怎么去获得上面的jsonStr呢?像开篇提及的那种json字符串怎么才能生成的问题 附:如果遇到含有中文的url 如下操作:
location=encodeURI('content_p.html?id='+catalogid+'&title='+bookTitle+'&thumb='+bookThumb);
JavaScript->PHP:
使用js数组来完成json对象的封装:
var arrX={resitems:[]};
arrX.bookid=bookid;
for (var i=0; i < cellList.length; i++) {
var item=cellList[i];
var jsonRes={};
jsonRes.bookid=bookid;
jsonRes.res_id=item.itemStruct.id;
jsonRes.res_name=item.itemStruct.name;
jsonRes.src_origin=item.itemStruct.src;
jsonRes.src_hd=item.itemStruct.src_hd;
jsonRes.src_sd=item.itemStruct.src_sd;
jsonRes.src_td=item.itemStruct.src_td;
arrX.resitems.push(jsonRes);
}; var jsonResStr=JSON.stringify(arrX);
上面的代码是先创建arrX的json对象,对对象添加各种属性、变量等。最后通过stringify转化为字符串,这个获得的字符串jsonResStr就是一个普通字符串了,可以通过ajax传递到服务器了,值得注意的是,这里如果有中文,那是没问题的,不会出现乱码问题。在完成了JOSN封装之后,开始使用ajax传递到PHP页面
$.ajax({
type:"POST",
url:"SQLHelper.php",
dataType:"json",
async:false,
data:{'jsonResPanel':jsonResStr},
success:function(json){}
});
php对接收到的json数据解析并且写入到数据库:
if (isset($_POST['jsonResPanel'])) {
$data=$_POST['jsonResPanel'];
$arr=(array)(json_decode($data));
$items=(array)($arr['resitems']);
$bookid=$arr['bookid'];
$sql="";
for ($i=0; $i < count($items); $i++) {
$value=(array)($items[$i]);
$bookid=$value['bookid'];
$res_id=$value['res_id'];
$res_name=$value['res_name'];
$src_origin=$value['src_origin'];
$src_hd=$value['src_hd'];
$src_sd=$value['src_sd'];
$src_td=$value['src_td'];
$sql.="insert into resourcesheet(bookid,res_id,res_name,src_origin,src_hd,src_sd,src_td)values
('{$bookid}','{$res_id}','{$res_name}','{$src_origin}','{$src_hd}','{$src_sd}','{$src_td}');";
}
$sqli=new SQLHelper('ugumanage');
//先删除bookid下所有资源
$sqlDelete="delete from resourcesheet where bookid='{$bookid}'";
$sqli->execute_dml($sqlDelete);
$sqli->multi_execute_dml($sql);
$sqli->close_connect();
}
需要注意的是第三号在拿到json字符串之后便使用json_decode函数解析成对象,这个时候只是一个普通php对象,无法给我提供有效信息,需要将它强制转换为数组array即可变为我们熟悉的php数组,在拿到信息的数组之后,我们便可以像操作普通php数组那样提取json传递过来的所有信息了,上面代码将json的部分信息添加到数据库的一张表里边,当然如果传递的json字符串过长,建议使用GZip在客户端对字符串压缩之后再传递,接收端解压缩即可。
PHP->JavaScript:
如果客户端需要查询数据库的数据,必然需要要求服务器查询,由php将查询结果通过json返回给客户端。
首先客户端通过ajax发送查询请求给php
var request=$.ajax({url:'SQLHelper.php?loadResPanel='+bookid,async:false});
var jsonStr=request.responseText;
第二行表示得到了查询结果,下面来看看在php端是怎么生成这个结果并返回的。
if (isset($_REQUEST['loadResPanel'])) {
$bookid=$_REQUEST['loadResPanel'];
$sqli=new SQLHelper('ugumanage');
$arr=array();
$arrItems=array();
$arrInfo=array();
$head=urlencode("http://{$_SERVER['HTTP_HOST']}/cloud/");
$sql0="select *from contentsheet where bookid='{$bookid}'";
$res0=$sqli->execute_dql($sql0);
while ($row0=$res0->fetch_assoc()) {
$catalogid=$row0['catalogid'];
$bookid=$row0['bookid'];
$title=urlencode($row0['title']);
}
$sql1="select *from resourcesheet where bookid='{$bookid}'";
$res1=$sqli->execute_dql($sql1);
while ($row1=$res1->fetch_assoc()) {
$item=array('bookid'=>$row1["bookid"],'res_id'=>$row1['res_id'],'res_name'=>urlencode($row1["res_name"]),
'src_origin'=>$row1["src_origin"],'src_hd'=>$row1["src_hd"],'src_sd'=>$row1["src_sd"],'src_td'=>$row1["src_td"]);
array_push($arrItems,$item);
} $arrInfo['head']=$head;
$arrInfo['catalogid']=$catalogid;
$arrInfo['bookid']=$bookid;
$arrInfo['title']=$title;
$arr['info']=$arrInfo;
$arr['items']=$arrItems;
$json=urldecode(json_encode($arr)) ;
echo $json;
$sqli->close_connect();
}
值得注意的是第七行这种,遇到特殊符号或者中文字符,在php端需要将它们统一转码,具体转成了什么,我们不用关心,只需要知道在外面套一个urlencode函数就可以了。创建json同样是使用数组,编制好数组之后,通过json_encode可以直接将其转化为json字符串。这里在返回给客户端之前,仍然需要再使用urldecode解码,这样传递出来的json字符串才不会有乱码现象。
客户端接收到json字符串后同样需要对它进行解析成javascript对象。
var request=$.ajax({url:'SQLHelper.php?loadResPanel='+bookid,async:false});
var jsonStr=request.responseText; var jsonObj=JSON.parse(jsonStr);
var info=jsonObj.info;
var items=jsonObj.items; document.getElementById('textBox').value=info.title;
for (var i=0; i < items.length; i++) {
var item=new UploadItemStruct();
item.id=items[i].res_id;
item.head=info.head;
item.name=items[i].res_name;
// item.type=$(this).attr('type');
item.src=items[i].src_origin;
item.src_hd=items[i].src_hd;
item.src_sd=items[i].src_sd;
item.src_td=items[i].src_td;
addCellSubThree(document.getElementById("divPanel"),item);
};
注意的是第四行。解析json的关键方法是JSON.parse方法,json字符串变成javascript对象之后,便可以任意提取json传递过来的讯息了。
javascript和php使用ajax通信传递JSON的更多相关文章
- Jquery Ajax方法传递json到action
ajax向后台传入json需要设置option,如下 contentType:'application/json' data:Json.Stringify(jsObj) 后台处理复杂json对象(不知 ...
- 使用Javascript Ajax 通信操作JSON数据 [下]
上一篇文章我们获得后台数据库的数据后转换成json格式然后返回到前台,但只是返回的一位数组,这次我们返回二维和三维数组和对象. 前台代码shizhan.html: <!DOCTYPE html& ...
- 使用Javascript Ajax 通信操作JSON数据 [上]
以前只是知道json的格式而已,也做过的是从数据库获得数据然后弄成json的格式然后赋给HighCharts生成曲线,先把数据库的数据使用array()函数转换成数组,然后使用json_encode( ...
- Ajax中传递Json格式的参数
$.ajax({ type: "post", url: baseUrl+"sys/login", dataType: "json", con ...
- AJAX如何传递json对象给后端
如果页面上一直报错,根本没有触发异步请求的话,首先就要检查接口或者路径是否写对或者写全,在去考虑是否跨境的问题. 如果想要给后端传递一个json对象,需要在路径上一句添加content:applica ...
- 使用Ajax方式POST JSON数据包(转)
add by zhj: 用ajax发送json数据时注意两点, 第一,使用JSON.stringify()函数将data转为json格式的字符串,如下 data: JSON.stringify({ ...
- 前端学习——使用Ajax方式POST JSON数据包
0.前言 本文解释怎样使用Jquery中的ajax方法传递JSON数据包,传递的方法使用POST(当然PUT又有时也是一个不错的选择).POST JSON数据包相比标准的POST格式可读性更好 ...
- jquery的ajax向后台servlet传递json类型的多维数组
后台运行结果: 前台运行结果: ...
- 深入理解ajax系列第七篇——传递JSON
前面的话 虽然ajax全称是asynchronous javascript and XML.但目前使用ajax技术时,传递JSON已经成为事实上的标准.因为相较于XML而言,JSON简单且方便.本文将 ...
随机推荐
- C/S结构与B/S结构
按照是否需要访问网络,程序可分为网络程序与非网络程序.其中网络程序又可分为B/S结构与C/S结构. C/S结构是指客户端(Client)/服务器(Server)模式,这种模式的客户端中 需要安装一个R ...
- Linux命令的那些事(二)
回顾Linux(一) 学习了以下命令: mkdir/rmdir/ls/rm/pwd/cd/touch/tree/man/--help 想具体了解请看上一篇文章跳转 在Linux中推荐大家使用subli ...
- 32bit 天堂2 windows 2000 server架设教程
服务器的软件要求: Microsoft Windows 2000 Server or advanced Server license 100 Microsoft SQL Server 2000 Ent ...
- k倍区间:前缀和
[蓝桥杯][2017年第八届真题]k倍区间 题目描述 给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍数 ...
- NO.7:自学python之路------类的方法、异常处理、socket网络编程
引言 我visual studio 2017就算体积巨大.启动巨慢.功能简陋也不会安装PyCharm的,嘿呀,真香.好吧,为了实现socket网络编程,更换了软件. 正文 静态方法 只是在名义上归类管 ...
- HTML和JS自解码机制
1.HTML 如果用户的输入被嵌入到HTML代码中,会进行HTML解码 解码方式包括: 1.HTML实体编码: 假定下面onclick后面的内容是可控的 点击按钮 2.进制编码: 点击按钮 2.JS ...
- vi/vim命令详解
基础命令学习目录首页 原文链接:https://www.cnblogs.com/mondol/p/vi-examples.html 进入vi vi filename # 打开或新建文件,并将光标置于第 ...
- 浅谈!DOCTYPE声明的作用?严格模式与混杂模式的区别?
!DOCTYPE的作用: DOCTYPE是Document Type(文档类型)的缩写,<!DOCTYPE>声明必须是html文档的第一行,位于<html>标签之前.<! ...
- The serializable class XXX does not declare a static final serialVersionUID field of type long的警告
原文: http://blog.csdn.net/ultrakang/article/details/41820543
- 2018年第九届蓝桥杯【C++省赛B组】
2标题:明码 汉字的字形存在于字库中,即便在今天,16点阵的字库也仍然使用广泛.16点阵的字库把每个汉字看成是16x16个像素信息.并把这些信息记录在字节中. 一个字节可以存储8位信息,用32个字节就 ...