首先要知道我们常所说的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,如需转载请自行联系原作者