Найкращий спосіб створити порожній об'єкт у JSON за допомогою PHP?


93

Для створення порожнього об'єкта JSON я зазвичай використовую:

json_encode((object) null);

приведення null до об’єкта працює, але чи існує інший кращий спосіб та / або проблема з цим рішенням?


Чому б ви перетворили null на об'єкт JSON? Крім того, чи не кінцевим результатом буде {}? Ви могли б просто це зробити.
Айман Сафаді

1
(об'єкт) (масив ()) може? Ваше рішення звучить добре.
malletjo

1
json_encode()повертає рядок, а не об'єкт. Навіщо це робити? Мені чогось тут не вистачає?
Тельмо Маркес,

2
ну насправді "{}" виходить у вигляді рядка! Я хочу отримати такий результат, як: {"some_property": {}}, який є порожнім json-об'єктом. Я перетворюю null в об'єкт, оскільки наразі я не знаю жодного рішення;)
pna

Мені подобається ваше рішення 8]
Ендрю,

Відповіді:


112

Ваше рішення може спрацювати ..

Документація вказує, що (object) nullпризведе до порожнього об'єкта, деякі можуть сказати, що ваш код дійсний і що це метод, який слід використовувати.

PHP: Об'єкти - Керівництво

Якщо значення будь-якого іншого типу перетворюється на об'єкт, створюється новий екземпляр вбудованого класу 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);

1
після використання "new ArrayObject ()" або "(object) null" я отримую => "Object", а не '{}' як відповідь. за допомогою php 5.6.29.
rohitmb

81

Якщо ви використовуєте об'єкти як динамічні словники (і, мабуть, ви використовуєте), то, я думаю, ви хочете використовувати 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.


5
Це найбільш правильна відповідь тут, вона робить саме те, що потрібно в цьому випадку
Аві Капуя

2
Дякую, це найкраща відповідь і точно відповідає моїм потребам. Перш ніж прочитати це, мій код починався з, 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 марно.
user2690527

Getcha не повинен застосовуватися - оскільки ArrayObjectреалізація iterable, ви можете робити і те is_iterable($foo), і інше , а не використовувати iterableпідказку типу замість array, що ви все одно повинні зробити, щоб залишити собі можливість передавати екземпляри ArrayAccess, наприклад.
Моріц Фрідріх

Класно! Відповідь оновлено.
wrygiel

17

Ну, json_encode()просто повертає рядок з PHP-масиву / об'єкта / тощо. Ви можете досягти того самого ефекту набагато ефективніше, виконавши:

$json = '{}';

Насправді немає сенсу використовувати функцію для цього.

ОНОВЛЕННЯ Відповідно до ваших оновлень коментарів, ви можете спробувати:

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

Хоча я не впевнений, що це щось краще від того, що ти робив.


1
ні, це рядок з деякими дужками всередині, я хочу досягти чогось на зразок: {"some_properties": {}} ... НЕ {"some_properties": "{}"}, що відрізняється.
pna

О, лайно, витратив занадто багато часу на написання мого повідомлення .. 8 хвилин запізно ха-ха!
Філіп Росен - реф.

@refp Ха-ха важко змагатися з енциклопедичною відповіддю :)
rdlowrey

хе-хе вибачте, rdlowrey, але @refp був дуже вичерпним;)
pna

9

Для створення порожнього об'єкта в JSON за допомогою PHP я використовував

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

який виробляв

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

що необхідно, бо пізніше я повинен це зробити

if(is_object($json))

5

Я завжди роблю (Object)[];, як:

$json = (Object)[]; // [] could also be array()

... пограйте з ним у PHP ...

$json = json_encode($json);

... тепер це справжній JSON ...


2

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"}
Фенді Сетіаван,

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.