Лучший способ создать пустой объект в JSON с PHP?

Чтобы создать пустой объект JSON, я обычно использую:

json_encode((object) null);

листинг null для объекта работает, но есть ли другой предпочтительный способ и/или любая проблема с этим решением?

Ответ 1

Ваше решение может работать.

В документации указано, что (object) null приведет к пустующему объекту, некоторые могут сказать, что ваш код действителен и что он использует метод.

PHP: объекты - руководство

Если значение любого другого типа преобразуется в объект, создается новый экземпляр встроенного класса stdClass. Если значение было NULL, новый экземпляр будет пустым.


.. но, старайтесь держать его в безопасности!

Хотя вы никогда не знаете, когда/если вышеуказанное изменится, поэтому, если вы хотите быть на 100% уверенным, что вы всегда будете иметь {} в своих закодированных данных, вы можете использовать взломы, такие как:

json_encode (json_decode ("{}"));

Несмотря на то, что он утомительный и уродливый, я предполагаю/надеюсь, что json_encode/json_decode совместим с одним и другим и всегда будет проверять следующее на true:

$a = <something>;

$a === json_decode (json_encode ($a)); 

Рекомендуемый метод

json_decode ("{}") вернет значение stdClass по умолчанию, используя приведенное ниже, поэтому следует считать безопасным. Хотя, как уже упоминалось, это почти то же самое, что и делать (object) null.

json_encode (new stdClass);

Ответ 2

Если вы используете объекты в качестве динамических словарей (и, как я полагаю, вы это делаете), я думаю, вы хотите использовать ArrayObject.

Он отображается в словаре JSON, даже когда он пуст. Замечательно, если вам нужно различать списки (массивы) и словари (ассоциативные массивы):

$complex = array('list' => array(), 'dict' => new ArrayObject());
print json_encode($complex); // -> {"list":[],"dict":{}}

Вы также можете легко манипулировать им (как это было бы с ассоциативным массивом), и оно будет корректно отображаться в словаре:

$complex['dict']['a'] = 123;
print json_encode($complex); // -> {"list":[],"dict":{"a":123}}

unset($complex['dict']['a']);
print json_encode($complex); // -> {"list":[],"dict":{}}

Если вам нужно, чтобы это было на 100% совместимо в обоих направлениях, вы можете также обернуть json_decode, чтобы он возвращал объекты ArrayObjects вместо stdClass (вам нужно будет пройти дерево результатов и рекурсивно заменить все объекты, что является довольно простой задачей).

Gotchas. Только тот, который я нашел до сих пор: is_array(new ArrayObject()) оценивается до false. Возможно, вам потребуется найти и заменить is_array вхождения в вашем коде (используйте (($foo instanceof ArrayObject) || is_array($foo))).

Ответ 3

Хорошо, json_encode() просто возвращает строку из массива/объекта PHP/и т.д. Вы можете добиться того же эффекта гораздо более эффективно, делая:

$json = '{}';

Нет смысла использовать функцию для выполнения этого.

UPDATE В соответствии с вашими комментариями вы можете попробовать:

$test = json_encode(array('some_properties'=>new stdClass));

Хотя я не уверен, что лучше, чем то, что вы делали.

Ответ 4

Чтобы создать пустой объект в JSON с PHP, я использовал

$json=json_decode('{}');
$json->status=202;
$json->message='Accepted';
print_r($json);

который произвел

stdClass Object
(
    [status] => 202
    [message] => Accepted
)

что необходимо, потому что позже я должен это сделать

if(is_object($json))