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

58

我有这段代码

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

echo json_encode($status, JSON_FORCE_OBJECT);


2
这是关于编程的内容。JSON 表示数组的方式是用方括号 []。在 JSON 中,方括号表示一个数组。 - Nishanth Matha
1
当前格式存在什么问题? - jogesh_pi
这是正确的JSON格式。数组使用大括号“[]”括起来。 - sarveshseri
7
问题在于它生成的JSON不一致(当为空时生成数组,而非空时生成对象)。其他解析器无法处理这个问题:https://dev59.com/oYTba4cB1Zd3GeqP_9q2 - MichaelD
2
这里的前三个评论都是不正确的。 - Tjalsma
5个回答

106

使用json_encode函数的JSON_FORCE_OBJECT选项:

json_encode($status, JSON_FORCE_OBJECT);

文档

JSON_FORCE_OBJECT (整数) 当一个非关联数组被使用时,输出一个对象而不是数组。当输出接收方期望一个对象而数组为空时尤其有用。自 PHP 5.3.0 起可用。

或者,如果您想在对象中保留您的“其他”数组,请不要使用先前的答案,而是使用以下内容:

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

9
问题在于像 ["one"] 这样的数组会被转换成一个错误的对象。 - Luke
2
这里的答案回答了OP的问题。您需要查看其他答案来部分地保留对象内的数组。 - Taha Paksu
4
重点是:不要使用JSON_FORCE_OBJECT(除非你想让普通数组变形/加上花括号)。在您的JSON树中,您必须验证每个对象节点是否为空,并手动将其转换为对象或用 new stdClass() 替换... - Dimitry K

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

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

当无法使用 JSON_FORCE_OBJECT 且无法(或不想)使用实际对象作为值时,这很有用。


8
在PHP中,数组和“对象”(以JSON的意义为准)之间没有区别。如果您想强制所有数组被编码为JSON对象,请设置JSON_FORCE_OBJECT标志,自PHP 5.3以来可用。请参见http://php.net/json_encode。请注意,这将适用于所有数组。
或者,您可以在PHP代码中实际使用对象而不是数组:
$data = new stdClass;
$data->foo = 'bar';
...

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

1
我知道这是一个老问题,但它是谷歌搜索结果中的前几个,所以我想分享一种替代解决方案。与使用标准PHP数组不同,在PHP 7+中,您可以使用数据结构扩展中的Map()文档
Map对象与数组具有几乎相同的性能,并且还实现了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"}

这是一个不错的解决方案,但值得注意的是,数据结构不是 PHP 的内置扩展。在使用之前需要安装它。安装说明 可在 php.net 上找到。 - Tahir Raza

0

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

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

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


如果字符串中包含[],则此方法无法正常工作:str_replace('[]', '{}', json_encode(['key' => '[]'])) --> {"key":"{}"} - siikamiika

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接