当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_encode
的JSON_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函数不返回大括号的主要内容,如果未能解决你的问题,请参考以下文章