PHP中json_encode将空数组转为{}而非[]的实现问题
解决PHP json_encode中空数组转空对象的问题
这个问题我之前也碰到过,直接用JSON_FORCE_OBJECT肯定不行——因为它会把所有数组都转成对象,包括你需要保持数组结构的data字段,结果完全不符合预期。下面给你两个靠谱的解决方案:
1. 针对性转换空数组为stdClass对象
在构建$variable数组时,当某个字段(比如baz)需要是空对象而非空数组,直接把它赋值为stdClass实例或者强制转换为空对象:
// 方式一:使用stdClass实例 $variable['data'][1]['baz'] = new stdClass(); // 方式二:强制类型转换 $variable['data'][1]['baz'] = (object) [];
执行json_encode($variable)后,这个字段会被序列化为{},而其他正常的索引数组(比如data本身)依然保持[...]的数组结构。
2. 递归批量转换所有空数组
如果你的数组结构复杂,没法逐个手动修改,可以写一个递归函数,遍历整个数组,把所有空数组自动转换成stdClass对象:
function convertEmptyArraysToObjects(&$array) { foreach ($array as &$value) { if (is_array($value)) { if (empty($value)) { // 空数组转成空对象 $value = new stdClass(); } else { // 非空数组递归处理嵌套结构 convertEmptyArraysToObjects($value); } } } } // 使用示例 $variable = [ 'info' => [ 'foo' => true, 'bar' => 'lion' ], 'data' => [ ['id' => 123, 'name' => 'foo', 'baz' => ['some' => 1, 'data' => true]], ['id' => 321, 'name' => 'bar', 'baz' => []] // 这里是空数组 ] ]; // 处理数组中的空数组 convertEmptyArraysToObjects($variable); // 生成目标JSON $json = json_encode($variable);
执行后,baz字段的空数组会被转为{},完全符合你需要的JSON格式。
为什么不能用JSON_FORCE_OBJECT?
JSON_FORCE_OBJECT会强制将所有数组(包括索引数组)序列化为JSON对象,比如你的data数组会变成{"0": {...}, "1": {...}},而不是你需要的数组形式[...],这显然不符合需求,所以这个选项不能直接使用。
内容的提问来源于stack exchange,提问作者Blaztix
相关产品推荐
相关产品推荐

