【问题标题】:Why PHP ignores empty objects in JSON?为什么 PHP 会忽略 JSON 中的空对象?
【发布时间】:2015-01-13 12:49:40
【问题描述】:

我正在尝试使用 post 方法将 JSON 数据从 jQuery ajax 传递到 PHP。然后我必须将此数据保存到文本文件中。

这是我要提交给 PHP 的主要对象中的 JSON 节点。 我从 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_dump 这个 $_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));

【问题讨论】:

  • 你能发布发出 post 调用的 JavaScript 吗?
  • @robbmj 好的,我只是更新问题。
  • 您是否在代码中的任何时候对data 调用JSON.stringify() data 对象继承自另一个对象?
  • 不,我没有在我的代码中的任何地方使用JSON.stringify()。当我尝试在 ajax 调用之前转储 data 变量时,我可以看到 files 节点。

标签: javascript php jquery ajax json


【解决方案1】:

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

这是一个例子:

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

如果屏幕看到开头的[?

这是$.ajax data 字段的文档

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

以下是 jQuery 对 traditional setting 的评价。

注意:因为没有普遍认可的参数字符串规范,所以不可能使用这种方法以一种在所有支持这种输入的语言中都能理想地工作的方式对复杂的数据结构进行编码。使用 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
}"

【讨论】:

  • 很抱歉弄得一团糟。
  • OP 正在尝试使用默认设置发送 JSON(假设您正在尝试使用 application/x-www-form-urlencoded 编码发送名称-值对)。
猜你喜欢
  • 2016-09-14
  • 2020-11-20
  • 2019-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-22
  • 2013-03-15
  • 1970-01-01
相关资源
最近更新 更多