Javascript 为什么PHP忽略JSON中的空对象?
我试图用post方法将JSON数据从jQueryAjax传递到PHP。然后我必须将这些数据保存到一个文本文件中 这里是我的主对象中的一个JSON节点,我想提交给PHP。 我从Chrome的控制台上抓到了这张照片,因为我很懒 这是进行调用的javascript代码:Javascript 为什么PHP忽略JSON中的空对象?,javascript,php,jquery,ajax,json,Javascript,Php,Jquery,Ajax,Json,我试图用post方法将JSON数据从jQueryAjax传递到PHP。然后我必须将这些数据保存到一个文本文件中 这里是我的主对象中的一个JSON节点,我想提交给PHP。 我从Chrome的控制台上抓到了这张照片,因为我很懒 这是进行调用的javascript代码: function save(data, backup, notify, clear) { $.ajax({ type: "POST", url: "user.php?action=save&backup=
function save(data, backup, notify, clear) {
$.ajax({
type: "POST",
url: "user.php?action=save&backup="+backup,
data: data,
async: false,
success: function(result){
console.log(result);
},
error:function(e){
console.log(console.log(e));
}
});
}
然后,当我尝试在php中使用var_转储此$_POST数据时,输出如下所示:
var_dump($_POST);
// save
file_put_contents($file, json_encode($_POST,JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
如您所见,“文件”节点消失。为什么?如何将空节点传递给PHP?我只需要带密钥的“文件”节点。我将在一段时间前添加一些值
解决方案:
在JS中:
data: {"data": JSON.stringify(data) },
在PHP中:
$data = json_decode(stripslashes($_POST['data']));
file_put_contents($file, json_encode($data, JSON_PRETTY_PRINT));
问题是您的对象不是jQuery所认为的对象 以下是一个例子:
var obj = {"c":{}};
var arrayOfObjects = [obj];
jQuery.isPlainObject(arrayOfObjects); // false
如果屏幕不显示,请参阅开头的[
这是$.ajax数据
字段的文档
资料
类型:纯对象、字符串或数组
要发送到服务器的数据。如果尚未转换为字符串,则会转换为查询字符串。它会附加到GET请求的url中。请参阅processData选项以防止此自动处理。对象必须是键/值对。如果值是数组,则jQuery会基于传统设置的值使用相同的键序列化多个值(如下所述)
以下是jQuery对这个问题的看法
注意:由于没有一致同意的参数字符串规范,因此不可能使用此方法对复杂数据结构进行编码,使其在支持此类输入的所有语言中都能理想地工作。请使用JSON格式作为编码复杂数据的替代方法
您可以通过执行以下操作来解决此问题:
$.ajax({
type: "POST",
url: "user.php?action=save&backup="+backup,
data: JSON.stringify(data),
// ...
});
作为记录,PHP没有空JSON对象的问题
$json = json_decode('{"c":{},"b":2}');
var_dump(json_encode($json,JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
// output
string(33) "{
"c": {
},
"b": 2
}"
你能发布发出post调用的JavaScript吗?@robbmj好的,我只是更新了这个问题。你在代码调用
JSON.stringify()时有没有在data
上调用data
对象?没有,我没有使用JSON.stringify()
在我的代码中的任何地方。当我尝试在ajax调用之前转储数据
变量时,我可以看到文件
节点。问题与PHP无关,但与jQuery有关。很抱歉,mess.OP正在尝试使用默认设置发送JSON(假设您正在尝试使用application/x-www-form-urlencoded
编码发送名称-值对)。