Javascript 为什么PHP忽略JSON中的空对象?

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=

我试图用post方法将JSON数据从jQueryAjax传递到PHP。然后我必须将这些数据保存到一个文本文件中

这里是我的主对象中的一个JSON节点,我想提交给PHP。 我从Chrome的控制台上抓到了这张照片,因为我很懒

这是进行调用的javascript代码:

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
编码发送名称-值对)。