Zend Fraamewark 1.12でajaxから伝えられたjsonデータを受け取ります.


まず、私たちがよく言っているjsonの対象は実は間違っています.実際にはjavascriptの対象を指しています.javascript言語サポートはjson形式でオブジェクトを作成します.文章を書いてみたら、完璧な話です.http://www.cnblogs.com/TomXu/archive/2012/01/11/2311956.html
したがって、jsonデータを転送するには、一般的にはjson形式の規範に合った文字列を渡すだけで、contentTypeを「aplication/json」に設定し、javascriptオブジェクト(いわゆるJsonオブジェクト)を渡すと、過去のオブジェクトをkey=value&key 1=value 1のフォーマットに変換します.このような変換の後、文字列はjson形式に合わないので、バックグラウンドのプログラムはjsonオブジェクトとして扱われません.
私たちはプログラムで合法的なjson文字列かどうかを判断できます.PHP言語で、Zend Frame eworkフレームの下で例を示します.
フロントエンドの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>
伝えられたのはjsonsdataで、これは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%5 B%5 D=w 2&value%5 B%5 D=3で、楽屋ではjson形式でこのようなデータを処理できません.
一つの方法は、contentType:「aplication/json」を削除して、デフォルトのaplication/x-wn-form-urlencodedにして、次のコードのような値を得ることです.
echo$this->get Request()->getParam("value")[0];
第二の方法は呼び出し方法のパース_である.str()は、変数値を直接解析します.注意:転送contentType:「aplication/json」というタイプのデータは、通常はrequestのget RawBody()方法で取得されます.
$rawBody=$this->getRequest()->getRawBody();
parse_str($rawBody);
echo $value[0];
それはちょっとここの目的から逸れています.どうやってjsonを処理するかを紹介します.
実は上のクッションを通して大体を知ることができます.まず、Json文字列をバックグラウンドに伝えなければなりません.バックグランドはこの本物の文字列を獲得してPHP自身の対象に変えます.PHP環境では、contentType:「appication/json」というタイプのデータを転送するために、通常はrequestのget RawBody()方法を用いて、元のpost要求の情報を取得する.サンプルコードは以下の通りです.
<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
"; $o=(object)$json; echo $o->value1[0],$o->value1[1],$o->value2,"\r
";// } $this->getHelper("layout")->disableLayout(); $this->getHelper("viewRenderer")->setNoRender(true); }
上記のコードは、json文字列がphpバックグラウンドに伝達され、配列またはオブジェクトに変換される方法を示しています.ご参考までに.