首先要知道我們常所說的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);
}