JavaScript代码:
$.ajax({
type: "POST",
url: "postTestingResult.php",
data: {data: JSON.stringify(sendData)},
dataType: "json",
success: ajaxSuccess,
error: ajaxError
});
PHP代码
$data = json_decode($_POST['data'], TRUE);
当我将复杂的数据结构发布到服务器时,最外层的数组正在成为一个字符串。例如,JavaScript对象可以是
var data = {"apps": [[1,2,3], [4,5,6]]}
使用JSON.stringify(数据),这变为
"{"apps": "[[1,2,3], [4,5,6]]"}" //As seen via console.log(data) in Chrome console
但是在做了json_decode($ _ POST ['数据'],TRUE)之后就变成了
array('apps' => '[[1,2,3], [4,5,6]]') //As seen via var_export($data, TRUE)
这里发生了什么?为什么数组被转换为字符串?要查看完整的JSON对象和完整的PHP对象check out this pastebin with the two。
非常感谢任何帮助,谢谢。
更新:找到答案 我找到了罪魁祸首。我也在使用Prototype.js,它正在向Object原型添加一个toJSON方法。 Check out this SO question for details
答案 0 :(得分:3)
试试这个。以application/json
明确发送您的数据,不要包裹您的sendData
:
var sendData = {'apps': [[1,2,3], [4,5,6]]};
$.ajax({
type: 'POST',
url: 'postTestingResult.php',
data: JSON.stringify(sendData), // don't wrap your JSONified object
contentType: 'application/json' // set application/json - default is x-form-urlencoded
});
请注意标题和数据:application/json
:
当然,正如您所强调的那样,现在$_POST
超全球中的数据将无法使用。但这不是问题,获取JSON数据字符串的一种非常常见的方法是通过php://input
读取 raw 发布数据:
$data = array();
$json = file_get_contents('php://input'); // read JSON from raw POST data
if (!empty($json)) {
$data = json_decode($json, true); // decode
}
print_r($data);
收率:
Array(
[apps] => Array (
[0] => Array (
[0] => 1
[1] => 2
[2] => 3 )
[1] => Array (
[0] => 4
[1] => 5
[2] => 6
)
))
希望这会有所帮助:)
修改强>
请注意PHP documentation州:
注意:使用php://输入打开的流只能读取一次;流不支持搜索操作。
然而,iirc已经或将要改变(可能在PHP 5.6中)。尽管如此,请不要引用我的话,如果您打算重新使用它,不要忘记分配该流的内容!