Для створення порожнього об'єкта JSON я зазвичай використовую:
json_encode((object) null);
приведення null до об’єкта працює, але чи існує інший кращий спосіб та / або проблема з цим рішенням?
Для створення порожнього об'єкта JSON я зазвичай використовую:
json_encode((object) null);
приведення null до об’єкта працює, але чи існує інший кращий спосіб та / або проблема з цим рішенням?
json_encode()повертає рядок, а не об'єкт. Навіщо це робити? Мені чогось тут не вистачає?
Відповіді:
Документація вказує, що (object) nullпризведе до порожнього об'єкта, деякі можуть сказати, що ваш код дійсний і що це метод, який слід використовувати.
Якщо значення будь-якого іншого типу перетворюється на об'єкт, створюється новий екземпляр вбудованого класу stdClass. Якщо значення було NULL, новий екземпляр буде порожнім.
Хоча ви ніколи не знаєте, коли / чи зміниться вищезазначене, тому, якщо ви хочете бути на 100% впевнені, що у вас завжди буде {}в результаті кодовані дані, ви можете використати такий хак, як:
json_encode (json_decode ("{}"));
Незважаючи на те, що це нудно і потворно, я припускаю / сподіваюся, що json_encode / json_decode сумісний з одними та іншими, і завжди буде оцінювати наступне як істинне:
$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випадки на is_iterable.
jsonResponse = array()а потім він динамічно заповнювався циклом. Якщо цикл не мав жодної ітерації, "порожній" об'єкт (або словник, як ви його називаєте) був закодований, як []тоді, коли всі інші випадки кодувались як "{attr_1: value1, ...} . All the other answers around here have a flaw. They assume that one already knows if the dictionary is empty or not in advance. Especially the answer that tells one should simply write $ json = {}` і взагалі не використовувати json_encode марно.
ArrayObjectреалізація iterable, ви можете робити і те is_iterable($foo), і інше , а не використовувати iterableпідказку типу замість array, що ви все одно повинні зробити, щоб залишити собі можливість передавати екземпляри ArrayAccess, наприклад.
Ну, 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))
json_encode($array, JSON_FORCE_OBJECT)зробить це теж. див. https://www.php.net/manual/en/function.json-encode.php
json_encode(['a', 'b'], JSON_FORCE_OBJECT)повернеться{"0": "a", "1": "b"}
Ви також можете використовувати
$var = ["key" => (object) array()];
json_encode($var);