Зачем преобразовывать null в объект JSON? Кроме того, не будет ли конечный результат {}? Вы могли бы просто сделать это.
Айман Сафади
1
(объект) (array ()) может быть? Ваше решение звучит хорошо.
malletjo
1
json_encode()возвращает String, а не объект. Зачем это делать? Я что-то упустил?
Telmo Marques
2
ну на самом деле "{}" выглядит как строка! Я хочу получить такой результат: {"some_property": {}}, это пустой объект json. Я преобразовываю нуль в объект, потому что пока не знаю другого решения;)
pna
Мне нравится ваше решение 8]
Эндрю
Ответы:
117
Ваше решение может сработать ..
В документации указано, что (object) nullрезультатом будет пустой объект, поэтому некоторые могут сказать, что ваш код действителен и что это метод, который следует использовать.
Если значение любого другого типа преобразуется в объект, создается новый экземпляр встроенного класса stdClass. Если значение было NULL, новый экземпляр будет пустым.
.. но постарайтесь сохранить это в безопасности!
Хотя вы никогда не знаете, когда / если вышеизложенное изменится, поэтому, если вы хотите быть на 100% уверены, что вы всегда будете иметь {}в ваших закодированных данных, вы можете использовать хак, например:
json_encode (json_decode ("{}"));
Несмотря на то, что это утомительно и уродливо, я предполагаю / надеюсь, что json_encode / json_decode совместим с одним и другим и всегда будет оценивать следующее как истинное:
json_decode ("{}")вернет значение stdClassпо умолчанию, использование приведенного ниже должно считаться безопасным. Хотя, как уже упоминалось, это почти то же самое, что и делать (object) null.
Если вам нужно, чтобы это было на 100% совместимо обоих направлениях , вы также можете обернуть,json_decodeчтобы он возвращалсяArrayObjectsвместоstdClass объектов (вам нужно пройти по дереву результатов и рекурсивно заменить все объекты, что является довольно простой задачей).
Попался . Пока что я нашел только одно: is_array(new ArrayObject())оценивается в false. Вам нужно найти и заменить is_arrayвхождения наis_iterable .
Это самый правильный ответ здесь, он делает именно то, что нужно в данном случае,
Ави Капуя
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 = '{}';
На самом деле нет смысла использовать функцию для этого.
ОБНОВЛЕНИЕ
В соответствии с вашими обновлениями комментариев вы можете попробовать:
нет, это строка с некоторыми скобками внутри, я хочу добиться чего-то вроде: {"some_properties": {}} ... НЕ {"some_properties": "{}"}, которое отличается.
pna
Вот дерьмо, я потратил слишком много времени на написание своего поста ... На 8 минут поздно, ха-ха!
Филип Розеен - ссылка
@refp Ха-ха, сложно конкурировать с энциклопедическим ответом :)
rdlowrey
хе-хе, прости, rdlowrey, но @refp был очень исчерпывающим;)
pna
10
Чтобы создать пустой объект в JSON с помощью PHP, я использовал
Спасибо ... Но имейте в виду, что это решение также преобразует неиндексированный массив в объект с парами ключ-значение. Например: json_encode(['a', 'b'], JSON_FORCE_OBJECT)вернется{"0": "a", "1": "b"}
json_encode()
возвращает String, а не объект. Зачем это делать? Я что-то упустил?Ответы:
Ваше решение может сработать ..
В документации указано, что
(object) null
результатом будет пустой объект, поэтому некоторые могут сказать, что ваш код действителен и что это метод, который следует использовать... но постарайтесь сохранить это в безопасности!
Хотя вы никогда не знаете, когда / если вышеизложенное изменится, поэтому, если вы хотите быть на 100% уверены, что вы всегда будете иметь
{}
в ваших закодированных данных, вы можете использовать хак, например:json_encode (json_decode ("{}"));
Несмотря на то, что это утомительно и уродливо, я предполагаю / надеюсь, что json_encode / json_decode совместим с одним и другим и всегда будет оценивать следующее как истинное:
Рекомендуемый метод
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))
источник
Я всегда так
(Object)[];
люблю:$json = (Object)[]; // [] could also be array()
... поиграйте с этим в PHP ...
... теперь это настоящий 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);
источник