我有这段代码
$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":{}}
答案 0 :(得分:49)
使用JSON_FORCE_OBJECT
的{{1}}选项:
json_encode
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"}