【问题标题】:To JSON and json_decode in PHP and JavaScriptPHP 和 JavaScript 中的 JSON 和 json_decode
【发布时间】:2010-03-03 21:32:39
【问题描述】:

我正在尝试通过jquery.ajax() 将 JavaScript 对象传递给 PHP 脚本,基本上:

var bigArray = new Object();
//Dode
//Start loop
bigArray[x] = {name: exname, id: exID, order:e, set: setBox, inc: incBox, example: exampleBox, day: i};

所以它几乎是这些对象的数组。

    var anotherTest = $.toJSON(bigArray);
    var ajxFile = "routineajax.php";
    $.ajax({
        type: 'POST',
        processData: false,
        url: ajxFile,
        data: anotherTest,
        success: function(data) {
            $('#result').html(data);
            alert('Load was performed.');
        }
    });
});

PHP 端脚本

 print_r($_POST);
 $params = json_decode($_POST);
 print_r($params)

Ajax 调用正在进行,我可以在 Firebug 中看到,但 print_r($_POST) 返回一个空数组。如果我在 $.ajax 函数和 PHP 脚本中将它更改为 $_GET ,它就可以工作。我的主要问题是收到此错误消息:

警告:json_decode() 期望参数 1 是字符串,数组中给出

我该如何解决这个问题?


将这个 sn-p 添加到 PHP 文件后

  $data = file_get_contents('php://input');
  var_dump($data);
  var_dump(json_decode($data));

我得到这个输出

string'{"0"{"name":"Decline`Abs","id":"54","order":0,"set":"","inc":"","example":"","day":1}}' (length=87)`
  object(stdClass)[2]
      public '0' =>
        object(stdClass)[4]
          public 'name' => string 'Decline Abs' (length=11)
          public 'id' => string '54' (length=2)
          public 'order' => int 0
          public 'set' => string '' (length=0)
          public 'inc' => string '' (length=0)
          public 'example' => string '' (length=0)
          public 'day' => int 1

所以至少它正在通过,但我不确定如何访问它,这是朝着正确方向迈出的一步!

【问题讨论】:

  • 你能用 print_r($_GET) 的结果编辑你的问题吗?我看到你在下面有它,但我不清楚。

标签: php jquery ajax json


【解决方案1】:

我认为问题在于通常以key=value&key2=value2 编码发送 POST 数据,而您将其作为 JSON 发送。尝试按如下方式访问原始帖子数据:

$data = file_get_contents('php://input');
var_dump($data);
var_dump(json_decode($data));

看看这是否有效。如果没有,请在您的问题中发布它返回的内容,如果有的话。


基于下面的评论和对 OP 的补充。

$datavar_dump 是否正确复制粘贴?我问的原因是:string'{"0"{"name" 在我看来不合适。这不是有效的 JSON 或正确编码的 POST 字符串。可能是某些字符在您复制和粘贴时被编码。

无论哪种方式,您现在都可以获得所需的结果。 stdClass 只是一个将数据放入的空白容器,您可以使用普通对象语法访问它。在这种情况下,我认为您必须执行$data->{0}->name,因为0。如果您执行$data = json_decode($data, true),它将是一个关联数组,您可以通过$data[0]['name'] 访问POST 后的数据。

如果您想继续探索这一点,在执行 ajax 请求之前显示执行 window.console.dir(data) 的结果可能会有所帮助,并确保在您 var_dump(data) 时查看要复制的页面源并粘贴。 window.console.dir(data) 将在 Firebug 窗口中显示 data 的属性(您使用的是 Firebug,对吗?)。它也适用于 Chrome 的调试器,也许还有其他的。就像我说的,看起来你可能已经得到了你需要的东西,所以没有必要进行调查。

【讨论】:

  • 我在 OP 中添加了输出。现在看来,它正朝着正确的方向发展。你能解释一下发生了什么吗?
  • 关于stdclass的问题,如果你不熟悉它:stackoverflow.com/questions/931407
【解决方案2】:

processData 设为真。我不相信您的 JSON 被正确传递。另请注意,它不会以 json 的形式出现,而是当您访问它时,您的 JSON 的键值对将是 $_POST 的内容。

另外,您的 bigArray 的值是否可以轻松转换为字符串?如果你传入 DOM 元素或其他东西,你就会遇到问题。

【讨论】:

  • 打开了 processData,但 PHP 仍然没有接收 $_POST。我知道它正在通过,因为我在这里的萤火虫中看到了它:Parametersapplication/x-www-form-urlencoded {"0":{"name":"Decline Abs... 只有 $_GET 已经通过..
  • 尽量不要将 bigArray 转换为 JSON。 jQuery.ajax() 无论如何都需要一个对象作为 data 参数:api.jquery.com/jQuery.ajax
  • 通过 POST 发送 bigArray 给了我这个数组 ( [0] => [object Object] [1] => [object Object] ) 所以好像它没有通过对象。
【解决方案3】:

还不够清楚吗? json_decode() 期望参数一是字符串,而不是数组。但$_POST$_GET 始终是数组。您可以将此数组的成员传递给json_decode()

要查看数组的内容,请使用这个 sn-p:

echo "<pre>";
print_r($_GET);
echo "</pre>";

【讨论】:

  • 我认为问题出在 toJSON 上,因为这是我得到的 $_GET 输出: Array ( [{"0":{"name":"Bent_Over_Rows","id":"27 ","order":0,"set":"","inc":"","example":"","day":1}}] => ) 而不是 0 => 元素。但至少数组错误消失了……
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-01
  • 1970-01-01
  • 2016-10-19
  • 1970-01-01
  • 2013-06-12
  • 1970-01-01
相关资源
最近更新 更多