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

96

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

json_encode((object) null);

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

pna
источник
Зачем преобразовывать null в объект JSON? Кроме того, не будет ли конечный результат {}? Вы могли бы просто сделать это.
Айман Сафади
1
(объект) (array ()) может быть? Ваше решение звучит хорошо.
malletjo
1
json_encode()возвращает String, а не объект. Зачем это делать? Я что-то упустил?
Telmo Marques
2
ну на самом деле "{}" выглядит как строка! Я хочу получить такой результат: {"some_property": {}}, это пустой объект json. Я преобразовываю нуль в объект, потому что пока не знаю другого решения;)
pna
Мне нравится ваше решение 8]
Эндрю

Ответы:

117

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

В документации указано, что (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 09
84

Если вы используете объекты в качестве динамических словарей (и я думаю, что да), то я думаю, вы хотите использовать 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 объектов (вам нужно пройти по дереву результатов и рекурсивно заменить все объекты, что является довольно простой задачей).

Попался . Пока что я нашел только одно: is_array(new ArrayObject())оценивается в false. Вам нужно найти и заменить is_arrayвхождения наis_iterable .

Wrygiel
источник
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 09
Попадание не должно применяться - поскольку ArrayObjectреализует iterable, вы можете делать и то, и другое, is_iterable($foo)а также использовать iterableподсказку типа вместо array, что вы должны сделать в любом случае, чтобы оставить себе возможность передавать экземпляры ArrayAccess, например.
Мориц Фридрих
Круто! Обновил ответ.
wrygiel
17

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

$json = '{}';

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

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

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

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

Rdlowrey
источник
1
нет, это строка с некоторыми скобками внутри, я хочу добиться чего-то вроде: {"some_properties": {}} ... НЕ {"some_properties": "{}"}, которое отличается.
pna
Вот дерьмо, я потратил слишком много времени на написание своего поста ... На 8 минут поздно, ха-ха!
Филип Розеен - ссылка
@refp Ха-ха, сложно конкурировать с энциклопедическим ответом :)
rdlowrey
хе-хе, прости, rdlowrey, но @refp был очень исчерпывающим;)
pna
10

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

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

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

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

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

if(is_object($json))
снег6ой
источник
6

Я всегда так (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"}
Фенди Сетиаван
1

вы также можете использовать

$var = ["key" => (object) array()];

json_encode($var);
Ришаб Парашар
источник