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

时间:2014-11-16 15:30:39

标签: javascript php jquery ajax json

我试图通过post方法将JSON数据从jQuery ajax传递给PHP。然后我必须将此数据保存到文本文件中。

这是我想要提交给PHP的主对象中的JSON节点。 我从Chrome控制台中捕获了这张图片,因为我很懒。

enter image description here

这是拨打电话的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_dump这个$ _POST数据时,输出如下所示:

var_dump($_POST);
// save
file_put_contents($file, json_encode($_POST,JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));

enter image description here

正如你可以看到"文件"节点消失。为什么?如何将空节点传递给PHP?我需要"文件"节点只有密钥。我会在一段时间后添加一些值。

解决方案:

在JS中:

data: {"data": JSON.stringify(data) },

在PHP中:

$data = json_decode(stripslashes($_POST['data']));
file_put_contents($file, json_encode($data, JSON_PRETTY_PRINT));

1 个答案:

答案 0 :(得分:1)

问题是你的对象不是jQuery认为的PlainObject

以下是一个例子:

var obj = {"c":{}};
var arrayOfObjects = [obj];
jQuery.isPlainObject(arrayOfObjects); // false

如果是屏幕,请参阅开头的[

这是$.ajax data字段

的文档
  

数据   类型:PlainObject或String或Array   要发送到服务器的数据。如果不是字符串,它将转换为查询字符串。它附加到GET请求的URL。请参阅processData选项以防止此自动处理。对象必须是键/值对。如果value是一个数组,jQuery会根据传统设置的值使用相同的键序列化多个值(如下所述)。

以下是jQuery对traditional setting

的评论
  

注意:由于param字符串没有普遍认可的规范,因此无法使用此方法对所有支持此类输入的语言进行理想的编码来编码复杂数据结构。使用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
}"