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

Posted

技术标签:

【中文标题】当php中的数组为空时,json_encode函数不返回大括号【英文标题】:json_encode function not return Braces when array is empty in php 【发布时间】: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(空时为数组,非空时为对象)。其他解析器对此有疑问:***.com/questions/26725138/… 这里的前三个cmets不正确。 【参考方案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';
...

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

【讨论】:

以上是关于当php中的数组为空时,json_encode函数不返回大括号的主要内容,如果未能解决你的问题,请参考以下文章

当过滤器为空时,它返回空数组

空 json_encode

我有一种形式可以更新mysql中的某些值,当输入为空时,如何避免更新单元格?

Laravel:当数组为空时数组循环的集合

MongoDb 仅当数组不为空时才在数组中添加字段

php中自带函数 json_encode