当php中的数组为空时,json_encode函数不返回大括号{}

时间:2015-01-28 10:03:53

标签: php arrays json

我有这段代码

$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":{}}

5 个答案:

答案 0 :(得分:49)

使用JSON_FORCE_OBJECT的{​​{1}}选项:

json_encode

Documentation

  

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

或者,如果您想在对象中保留“其他”数组,请不要使用上一个答案,只需使用:

json_encode($status, JSON_FORCE_OBJECT);

答案 1 :(得分:16)

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

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

当无法使用JSON_FORCE_OBJECT时以及当您无法(或不想)使用实际对象作为值时,此功能非常有用。

答案 2 :(得分:7)

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

或者你可以在PHP代码中使用对象而不是数组:

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

处理空数组客户端的边缘情况可能更简单。

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

我知道这是一个古老的问题,但这是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"}