Для создания пустого объекта 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);