【问题标题】:why does PHP json_encode ignore empty arrays?为什么 PHP json_encode 忽略空数组?
【发布时间】:2016-09-14 15:49:28
【问题描述】:

我有以下将数据发送到 PHP 函数的 javascript:

<script>
    var mydata = {
                   id:123,
                   name: 'mike',
                   orders: []
    };

    $.ajax({
       type: 'POST',
       url:  'test.php',
       data: {save_data:mydata},
       success: function(data) {
                   alert('php received: ' + data);
       }
    });
</script>

而我的test.php 文件包含以下代码:

<?php
     if (isset($_POST['save_data'])) {
          $json = json_encode($_POST['save_data']);
          echo $json;     // just to check what has been received
          exit();
     }
?>

我期望从 PHP 收到的是: {"id":"123","name":"mike","orders":"[]"}

我回复的是{"id":"123","name":"mike"}

请注意,orders 数组已从输出中删除。没有占位符。我尝试在数组中添加一些虚拟元素,效果很好,我收到了带有元素的数组。

我需要 PHP 按原样接收 json 对象,即使它包含空数组。

我该怎么做?

【问题讨论】:

  • 您可以将 content-type 设置为 application/json 并发送原始 json,而不是将 json 数据作为 url 编码发送。然后在 php 中使用可以使用 file_get_contents("php://input") 获取数据
  • 这不是 php。检查实际请求 - 没有那个空数组

标签: javascript php arrays json


【解决方案1】:

这不是 PHP 的错误。它导致 Jquery 在将其发送到服务器时会忽略空数组。所以你必须在发送之前将'orders'键中的数组解析为字符串JSON

var mydata = {
               id:123,
               name: 'mike',
               orders: []
};

改成

var mydata = {
               id:123,
               name: 'mike',
               orders: JSON.stringify([])
};

【讨论】:

  • 它将只是 "[]" 字符串。您还需要在服务器端解析此订单列表。
【解决方案2】:

JSON 对象是在 PHP 中创建的。在此之前,您只有表单数据。

jQuery 将以 PHP 友好的样式对表单数据进行编码。

如果你给它:

data: { foo: [1, 2, 3] }

它会将其转换为:

foo[]=1&foo[]=2&foo[]=3

(虽然它会对[]进行百分比编码)

每个值都有一个 key=value 对。

如果你有一个空数组,那么你就没有任何值,所以你不会得到任何 key=value 对。

无法使用 PHP 对表单 url 编码语法的扩展来编码“空数组”。


您有两个基本选择:

  1. 提前告诉 PHP 你要创建什么数据结构,并让它填充空数组。
  2. 在客户端生成 JSON

【讨论】:

  • 如果我有一个与从 json 传递的属性匹配的 PHP 类,它会起作用吗?如果是这样,我如何告诉 PHP 使用从 json 传递的值来实例化类的实例?
猜你喜欢
  • 2018-10-26
  • 2016-06-02
  • 2015-01-13
  • 1970-01-01
  • 2015-10-23
  • 2015-11-14
  • 1970-01-01
  • 1970-01-01
  • 2018-10-25
相关资源
最近更新 更多