为什么json_decode($ data,TRUE)将数组转换为字符串?

时间:2014-04-04 01:08:59

标签: javascript php json stringify

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

1 个答案:

答案 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

enter image description here

当然,正如您所强调的那样,现在$_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中)。尽管如此,请不要引用我的话,如果您打算重新使用它,不要忘记分配该流的内容!