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