PHP接收ajax的json数组

前言

前端和PHP端(服务器)通过ajax进行数据交互时,数据格式一般为字符串、数组、json、json数组。下面,我们针对这四种数据格式,进行前端和PHP端模拟交互,寻找一些规律和结论。

前端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
var data = {
product_name: '毛巾',
product_arr: ['毛巾','肥皂'],
product_json: {
product_name: '毛巾',
product_num: '5',
product_unit: '条'
},
product_json_arr: [{
product_name: '毛巾',
product_num: '5',
product_unit: '条'
},{
product_name: '肥皂',
product_num: '10',
product_unit: '块'
}]
}

console.log(data);

$.ajax({
url: '/',
type: 'POST',
dataType: 'json',
data: data,
success: function(data){
console.log(data);
},
error: function(xhr){
console.log(xhr);
}
});

PHP端

接收字符串

1
2
$product_name = $_POST['product_name'];
echo json_encode($product_name,JSON_UNESCAPED_UNICODE);


由结果看出,PHP端获取到了product_name。

接收数组

1
2
$product_arr = $_POST['product_arr'];
echo json_encode($product_arr,JSON_UNESCAPED_UNICODE);


由结果看出,PHP端获取到了product_arr。

1
2
$product_arr = $_POST['product_arr'];
echo json_encode($product_arr[0],JSON_UNESCAPED_UNICODE);


由结果看出,PHP端拿到的确实是数组。

接收json

1
2
$product_json = $_POST['product_json'];
echo json_encode($product_json,JSON_UNESCAPED_UNICODE);


由结果看出,PHP获取到了product_json。

1
2
$product_json = $_POST['product_json'];
echo json_encode($product_json->product_name,JSON_UNESCAPED_UNICODE);


根据返回结果,猜测PHP端拿到的json数据是字符串。

1
2
$product_json = json_decode($_POST['product_json']);
echo json_encode($product_json->product_name,JSON_UNESCAPED_UNICODE);


根据返回结果,证明PHP端拿到的json数据不是字符串。因为json字符串通过json_decode函数是可以转换成json格式数据的,而此处的json数据转换失败。

后端已经没有办法再变化,我们调整前端数据格式,把json数据先转化成字符串再传输。

1
2
3
4
5
6
7
var data = {
product_json: JSON.stringify({
product_name: '毛巾',
product_num: '5',
product_unit: '条'
})
}


根据返回结果,证明前端json数据必须先转换成字符串,然后PHP端可以获取json字符串,接着正常处理即可。

json数组

1
2
$product_json_arr = $_POST['product_json_arr'];  
echo json_encode($product_json_arr,JSON_UNESCAPED_UNICODE);


由结果看出,PHP端拿到了product_json_arr。

1
2
$product_json_arr = $_POST['product_json_arr'];  
echo json_encode($product_json_arr[0],JSON_UNESCAPED_UNICODE);


由结果看出,PHP端拿到的确实是数组。

1
2
$product_json_arr = $_POST['product_json_arr']; 
echo json_encode($product_json_arr[0]->product_name,JSON_UNESCAPED_UNICODE);


由结果看出,PHP端拿到的是数组,但是数组里的并不是json数据。

1
2
$product_json_arr = json_decode($_POST['product_json_arr'],true);
echo json_encode($product_json_arr[0]->product_name,JSON_UNESCAPED_UNICODE);


由结果看出,数组里的json数据不是字符串,猜测这里也需要前端先转json字符串。

调整前端数据格式,把json数组数据先转化成字符串再传输。

1
2
3
4
5
6
7
8
9
10
11
var data = {
product_json_arr: JSON.stringify([{
product_name: '毛巾',
product_num: '5',
product_unit: '条'
},{
product_name: '肥皂',
product_num: '10',
product_unit: '块'
}])
}


由结果看出,依然不行。

再次修改后端代码:

1
2
$product_json_arr = json_decode($_POST['product_json_arr']);
echo json_encode($product_json_arr[0]->product_name,JSON_UNESCAPED_UNICODE);


输出成功,也就是说,问题出在json_decode上面。json_decode($str, true) 可以得到数组,第二参数不加默认为false,得到对象。而json数组出现时,要选择生成对象。

小结

通过上面的实验,我们可以得出结论:涉及到json格式的数据,需要在前端先使用JSON.stringify()函数转换为字符串;然后,在PHP端通过json_decode()函数转换为对象。

0%