Функция json_encode не возвращает фигурные скобки {}, когда массив пуст в php

У меня есть этот код

$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":{}}

Ответы

Ответ 1

используйте параметр JSON_FORCE_OBJECT в json_encode:

json_encode($status, JSON_FORCE_OBJECT);

Документация

JSON_FORCE_OBJECT (integer) Выводит объект, а не массив, когда используется неассоциативный массив. Особенно полезно, когда получатель вывода ожидает объект, а массив пуст. Доступно с PHP 5.3.0.

Или, если вы хотите сохранить ваши "другие" массивы внутри вашего объекта, не используйте предыдущий ответ, просто используйте это:

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

Ответ 2

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

Извлекая массив в объект, json_encode всегда будет использовать фигурные скобки вместо скобок для значения (даже если оно пусто).

Это полезно, когда нельзя использовать JSON_FORCE_OBJECT, и когда вы не можете (или не хотите) использовать фактический объект для значения.

Ответ 3

Нет никакой разницы в PHP между массивом и "объектом" (в смысле JSON этого слова). Если вы хотите, чтобы все массивы были закодированы как объекты JSON, установите флаг JSON_FORCE_OBJECT, доступный с PHP 5.3. См. http://php.net/json_encode. Обратите внимание, что это применимо ко всем массивам.

В качестве альтернативы вы можете использовать объекты в своем PHP-коде вместо массивов:

$data = new stdClass;
$data->foo = 'bar';
...

Может быть, проще обрабатывать граничный случай пустых массивов на стороне клиента.