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