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

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

json_encode((object) null); 

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

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

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

Документация указывает, что (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); 

Если вы используете объекты как динамические словари (и, как я полагаю, вы это делаете), я думаю, вы хотите использовать 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":{}} с $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 в вашем коде (use (($foo instanceof ArrayObject) || is_array($foo)) ).

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

 $json = '{}'; 

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

ОБНОВЛЕНИЕ. В соответствии с вашими комментариями вы можете попробовать:

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

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

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

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

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

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

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

 if(is_object($json))