天天看點

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代碼如下:

<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格式。

$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()方法擷取。

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

那這就有點偏離本文的目的:如何介紹處理json。

<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>      
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);
}