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

ejk8hzay  于 2023-01-01  发布在  PHP
关注(0)|答案(5)|浏览(86)

我有这个密码

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

第一个月
此函数返回json:
{"message":"error","club_id":275,"status":"1","membership_info":[]}
但我需要这样的json:
{"message":"error","club_id":275,"status":"1","membership_info":{}}

44u64gxh

44u64gxh1#

使用json_encodeJSON_FORCE_OBJECT选项:

json_encode($status, JSON_FORCE_OBJECT);

Documentation

**JSON_FORCE_OBJECT(integer)**当使用非关联数组时,输出一个对象而不是数组。当输出的接收者期望一个对象而数组为空时特别有用。从PHP 5.3.0开始可用。

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

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

pw9qyyiw2#

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

通过将数组转换为对象,json_encode将始终使用大括号而不是括号来表示值(即使为空)。
这在不能使用JSON_FORCE_OBJECT以及不能(或不想)使用实际对象作为值时非常有用。

bq9c1y66

bq9c1y663#

在PHP中数组和“对象”(在JSON的意义上)没有区别。如果你想强制所有的数组都被编码为JSON对象,设置JSON_FORCE_OBJECT标志,从PHP 5.3开始就有了。参见http://php.net/json_encode。注意这将适用于 all 数组。
或者,您可以在PHP代码中使用 objects 来代替数组:

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

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

hk8txs48

hk8txs484#

我知道这是一个老问题,但它是谷歌上的第一个热门问题,所以我想我应该分享一个替代的解决方案。
在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"}
4szc88ey

4szc88ey5#

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

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

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

相关问题