Чтобы создать пустой объект JSON, я обычно использую:
json_encode((object) null);
листинг null для объекта работает, но есть ли другой предпочтительный способ и/или любая проблема с этим решением?
Чтобы создать пустой объект JSON, я обычно использую:
json_encode((object) null);
листинг null для объекта работает, но есть ли другой предпочтительный способ и/или любая проблема с этим решением?
В документации указано, что (object) null
приведет к пустующему объекту, некоторые могут сказать, что ваш код действителен и что он использует метод.
Если значение любого другого типа преобразуется в объект, создается новый экземпляр встроенного класса 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":{}}
Если вам нужно, чтобы это было на 100% совместимо в обоих направлениях, вы можете также обернуть json_decode
, чтобы он возвращал объекты ArrayObjects
вместо stdClass
(вам нужно будет пройти дерево результатов и рекурсивно заменить все объекты, что является довольно простой задачей).
Gotchas. Только тот, который я нашел до сих пор: is_array(new ArrayObject())
оценивается до false
. Возможно, вам потребуется найти и заменить is_array
вхождения в вашем коде (используйте (($foo instanceof ArrayObject) || is_array($foo))
).
Хорошо, json_encode()
просто возвращает строку из массива/объекта PHP/и т.д. Вы можете добиться того же эффекта гораздо более эффективно, делая:
$json = '{}';
Нет смысла использовать функцию для выполнения этого.
UPDATE В соответствии с вашими комментариями вы можете попробовать:
$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))