【发布时间】:2014-05-16 02:46:54
【问题描述】:
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(data) 这变成了
"{"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 对象check out this pastebin with the two。
非常感谢任何帮助,谢谢。
更新:找到答案 我找到了罪魁祸首。我也在使用 Prototype.js,它正在向 Object 原型添加一个 toJSON 方法。 Check out this SO question for details.
【问题讨论】:
-
看起来
JSON.stringify()有问题,因为那是嵌套数组变成字符串的时候。不过,仍在考虑可能发生的事情。 -
那么,
sendData是一个对象字面量吗?您是否尝试过在没有JSON.stringify()的情况下发送它。我认为您不需要 JSONifyPOSTed 对象文字数据。 -
@Darragh sendData 是一个复杂的数据对象。您可以在我链接到的 pastebin 中看到它的 JSON.stringify 版本。您可以将其(显然没有键/数据)视为:{[{[{[]},{[]}]},{[{[]},{[]}]}],{}}跨度>
-
@emab 我不会评估潜在的恶意代码。来自 php.net:“eval() 语言结构非常危险,因为它允许执行任意 PHP 代码。”除了 1)我不应该为此使用 eval 并且 2) eval 很慢!
-
@Sam 你在正确的轨道上!查看我发布的更新。 tl;dr:我还在我的代码中使用 Prototype.js,它正在向 Object 原型添加一个 toJSON 方法,如果它存在则由 JSON.stringify 调用
标签: javascript php json stringify