Чтобы создать пустой объект JSON, я обычно использую:
json_encode((object) null);
кастинг null для объекта работает, но есть ли другой предпочтительный способ и / или любая проблема с этим решением?
Документация указывает, что (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))