当前位置: 首页 > 知识库问答 >
问题:

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

刘博文
2023-03-14

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['data'],TRUE)之后

array('apps' => '[[1,2,3], [4,5,6]]') //As seen via var_export($data, TRUE)

这到底是怎么回事?为什么数组被转换为字符串?要查看完整的JSON对象和完整的PHP对象,请查看这个包含这两个对象的pastebin。

任何帮助都非常感谢,谢谢。

更新:答案发现我找到了罪魁祸首。我还使用Prototype.js,它向对象原型添加了一个toJSON方法。查看此SO问题了解详细信息。

共有1个答案

马新觉
2023-03-14

试试这个。以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://输入读取原始文章数据:

$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文档说明:

注意:以php://input 只能阅读一次;该流不支持搜索操作。

然而,iirc已经或将要改变(可能在PHP5.6中?)。不过,请不要引用我的话,现在,如果您打算重用该流,请不要忘记分配该流的内容!

 类似资料:
  • 问题内容: Oracle Java Community网站上的一篇文章提供了以下方法作为示例(对于JPA Converter,但这并不相关): 将String y强制转换为String val有什么用?有正当的理由吗? 原始文章:JPA的新增功能 问题答案: 这样的转换是完全没有必要的。我可以想象那是以前 但是后来参数类型更改为,而作者只是忘了删除强制类型转换。

  • 我有一个购物车php页面,在那里我显示客户端产品。在同一页中,我有一个表单,可以将客户的个人详细信息(如姓名、姓氏等)以及产品信息(如产品名称、数量等)直接发送到我的电子邮件地址。 现在,问题是,当我发送表单时,在我的电子邮件地址上,我收到了所有的信息,但没有产品细节,例如在订单电子邮件中的产品名称字段,我有ARRAY。 我看到将数组转换为字符串时出现问题,但我不知道如何转换,我尝试了几个示例,但

  • 我正在使用Schembuf在带有套接字的计算机之间更改数据。要传输数据,我使用以下内容: 然而,我注意到Protobuf无法读取任何非int类型的接收数据(它将其分配给0)。果不其然,如果我不使用套接字,但试图用相同的代码片段返回消息,则会发生相同的情况: 我还指出: 那么,为什么我不能正确地将数据转换回字符串呢?如果这是一个参考问题,为什么protobuf不能读取字符数组数据或从字符数组转换的字

  • 问题内容: 我想将数组转换为。例如字符串数组是这样的: 如何将此String数组转换为ArrayList? 问题答案: 为此使用此代码,

  • 问题内容: 我有两个字符串数组键和值 将它们转换为地图的最快方法是什么?我知道我们可以遍历它们。但是,这里有实用程序吗? 问题答案: 比这快吗?

  • 问题内容: 我想问一个有关将a转换为on的问题。这是我从服务器获取的代码。 这就是。 我怎样才能将我拥有的jsonArray转换为StringArray,这样我就可以得到StringArray: 谢谢您的帮助 :) 问题答案: 看一下本教程。您也可以像上面这样解析json: