Zend Framework 1.12中接受ajax传来的json数据

首先要知道我们常所说的json对象其实是一个误说,实际上指的是javascript对象。javascript语言支持按照json格式的方式创建对象。转一篇文章,说的非常完善。http://www.cnblogs.com/TomXu/archive/2012/01/11/2311956.html

因此要传递json数据,通常都是传递一串符合json格式规范的字符串而已,并且将contentType设置成"application/json",如果传递的是javascript对象(即所谓的json对象),则会把传递过去的对象转换成 key=value&key1=value1的格式。由于这种转换后,字符串就不符合json格式,因此后台的程序无法把它当做json对象来处理。

我们可以用程序来判断是否是合法的json字符串,以PHP语言,在Zend Framework框架下为例。

假设前端的javascript代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<script type= "text/javascript" >
    $( function (){
       jsondata={ "value" :[ "w2" ,3]};
         $( "#btnPost" ).click( function (){
         var  options = {
             type:  'POST' ,
             url:  "anypage" ,
             data: jsondata,
             success:  function  (result) {
               alert(result);
             },
             dataType:  "html" ,
             contentType: "application/json"
             };
         $.ajax(options);
       });
             });
</script>

传递的是一个jsondata,这是一个javascript对象,那么再传递到后台判断是否是符合json格式。

1
2
3
4
5
6
7
$contentType  $this ->getRequest()->getHeader( 'Content-Type' );
if ( strstr ( $contentType 'application/json' ))
{
   $rawBody = $this ->getRequest()->getRawBody();
   json_decode( $rawBody );
   echo  (json_last_error() == JSON_ERROR_NONE)?  "it's valid json data" : "Not a valid json data" ;
}

通过这段代码,我们点击按钮后,会弹出"Not a valid json data"对话框。它实际上传过去的字符串是value%5B%5D=w2&value%5B%5D=3,后台无法处理按json格式处理这样的数据,硬是要这样处理的话,

一种方法是去掉contentType:"application/json",使之成为默认的application/x-www-form-urlencoded,然后通过getParam的方法去获得值,比如下面的代码

echo $this->getRequest()->getParam("value")[0];

第二种方法是调用方法parse_str(),直接解析出变量值。注意:传递contentType:"application/json"这种类型的数据,通常都是采用request的getRawBody()方法获取。

1
2
3
$rawBody = $this ->getRequest()->getRawBody();
parse_str ( $rawBody );
echo  $value [0];

那这就有点偏离本文的目的:如何介绍处理json。

其实通过上面的一些铺垫,可以知道大概,首先,得传递Json字符串到后台,后台要获得这个正真的字符串后,转换成PHP自己的对象。在PHP环境中,要传递contentType:"application/json"这种类型的数据,通常都是采用request的getRawBody()方法,来获取原始的post请求的信息。示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<script type= "text/javascript" >
$( function (){
     jsondata={ "value1" :[ "w2" ,3], "value2" :990}; //假设传递的是这样的数据
     $( "#btnPost" ).click( function (){
       var  options = {
       type:  'POST' ,
       url:  "anyAction" ,
       data: JSON.stringify(jsondata),
       success:  function  (result) {
         alert(result);
       },
       contentType: "application/json" ,
       dataType:  "html"
     };
     $.ajax(options);
     });
});
</script>

后台代码为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public  function  anyAction()
{
   $contentType  $this ->getRequest()->getHeader( 'Content-Type' );
   if ( strstr ( $contentType 'application/json' ))
   {
       $rawBody = $this ->getRequest()->getRawBody();
       $json =Zend_Json::decode( $rawBody ); //此处$json就是一个数组,可以把它再次转换成对象
       echo  $json [ "value1" ][0], $json [ "value1" ][1], $json [ "value2" ], "\r\n" ;
       $o =(object) $json ;
       echo  $o ->value1[0], $o ->value1[1], $o ->value2, "\r\n" ; //转换成对象
   }
   $this ->getHelper( "layout" )->disableLayout();
   $this ->getHelper( "viewRenderer" )->setNoRender(true);
}

上述的代码,演示了json字符串传递到php后台,转换成数组,或者对象的方法。仅供参考。











本文转自cnn23711151CTO博客,原文链接: http://blog.51cto.com/cnn237111/1310414,如需转载请自行联系原作者




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值