【问题标题】:json_encode function not return Braces {} when array is empty in php当php中的数组为空时,json_encode函数不返回大括号{}
【发布时间】:2015-03-27 04:24:57
【问题描述】:

我有这个代码

$status = array(
                "message"=>"error",
                "club_id"=>$_club_id,
                "status"=>"1",
                "membership_info"=>array(),
                );

echo json_encode($status);

这个函数返回json:
{"message":"error","club_id":275,"status":"1","membership_info":[]}

但我需要这样的 json:

{"message":"error","club_id":275,"status":"1","membership_info":{}}

【问题讨论】:

  • 这就是json如何表示一个数组。 [] 代表 Json 中的数组
  • 当前格式有什么问题?
  • 这是正确的 json 格式。数组用大括号括起来 - "[ ]"。
  • @jogesh_pi 问题是它生成不一致的 json(空时为数组,非空时为对象)。其他解析器对此有疑问:stackoverflow.com/questions/26725138/…
  • 这里的前三个cmets不正确。

标签: php arrays json


【解决方案1】:

我知道这是一个老问题,但它是 Google 上最热门的问题之一,所以我想我应该分享一个替代解决方案。

在 PHP 7+ 中,您可以使用 Map() 作为数据结构扩展的一部分,而不是使用标准的 PHP 数组。 Documentation.

Map 对象将practically identical performance 作为数组并实现了 ArrayAccess,因此它可以作为常规数组进行访问。然而,与标准数组相反,它始终是关联的,并且可以与json_encode 一起按预期工作。它还有一些其他的小好处,比如对象键和更好的内存处理。

一些示例用法:

use Ds\Map;

$status = new Map([
            "message"=>"error",
            "club_id"=>$_club_id,
            "status"=>"1",
            "membership_info"=>array(),
          ]);

$map = new Map(); 
print json_encode($map); // {}

$map = new Map();
$map["foo"] = "bar";
print json_encode($map); // {"foo":"bar"}
print $map["foo"]; // bar

$map = new Map();
$map[1] = "foo";
$map[2] = "bar";
$map[3] = "baz"; 
print json_encode($map); // {"1":"foo","2":"bar","3":"baz"}

【讨论】:

    【解决方案2】:

    虽然这可能不被认为是优雅,但简单的字符串替换可以有效地解决这个问题。

    str_replace("[]", "{}", json_encode($data));
    

    这缓解了JSON_FORCE_OBJECT 将普通数组转换为对象的问题。

    【讨论】:

    • 如果字符串中有[],这将不起作用:str_replace('[]', '{}', json_encode(['key' => '[]'])) --> {"key":"{}"}
    【解决方案3】:

    使用json_encodeJSON_FORCE_OBJECT 选项:

    json_encode($status, JSON_FORCE_OBJECT);
    

    Documentation

    JSON_FORCE_OBJECT(整数) 使用非关联数组时输出对象而不是数组。当输出的接收者期待一个对象并且数组为空时特别有用。自 PHP 5.3.0 起可用。

    或者,如果你想在你的对象中保留你的“其他”数组,不要使用前面的答案,只需使用这个:

    $status = array(
                    "message"=>"error",
                    "club_id"=>$_club_id,
                    "status"=>"1",
                    "membership_info"=> new stdClass()
                    );
    

    【讨论】:

    • 是的,问题是像["one"] 这样的数组随后被转换为对象二,这是错误的。
    • 这里的答案回答了OP的问题。您需要查看其他答案以部分保留对象内的数组。
    • 底线:不要使用 JSON_FORCE_OBJECT(除非你想要你的普通数组被破坏/卷曲)。在您的 JSON 树中,您必须验证每个对象节点是否为空并手动将其转换为对象或替换为 new StdClass() ...
    【解决方案4】:
    $status = array(
                    "message"=>"error",
                    "club_id"=>$_club_id,
                    "status"=>"1",
                    "membership_info"=>(object) array(),
                    );
    

    通过将数组转换为对象,json_encode 将始终使用大括号而不是括号来表示值(即使为空)。

    这在无法使用 JSON_FORCE_OBJECT 以及您不能(或不想)使用实际对象作为值时很有用。

    【讨论】:

      【解决方案5】:

      在 PHP 中,数组和“对象”(在 JSON 的意义上)没有区别。如果要强制将所有数组编码为 JSON 对象,请设置 JSON_FORCE_OBJECT 标志,自 PHP 5.3 起可用。见http://php.net/json_encode。请注意,这将适用于 所有 数组。

      您也可以在 PHP 代码中实际使用 objects 而不是数组:

      $data = new stdClass;
      $data->foo = 'bar';
      ...
      

      也许在客户端处理空数组的边缘情况会更简单。

      【讨论】:

        猜你喜欢
        • 2017-05-21
        • 2016-06-02
        • 2016-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        • 2013-08-29
        相关资源
        最近更新 更多