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



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



json_encode((object) null);


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

1092   6  

6 ответов:

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

в документации указано, что (object) null приведет к пустому объекту, поэтому некоторые могут сказать, что ваш код действителен и что это метод для использования.

PHP: объекты-руководство

если значение любого другого типа преобразуется в объект, создается новый экземпляр встроенного класса stdClass создается. Если значение равно NULL, то новый экземпляр будет пустой.


.. но, постарайтесь сохранить его в безопасности!

хотя вы никогда не знаете, когда/если выше будут меняться, так что если вы хотите быть на 100% уверены, что вы всегда будете в конечном итоге с помощью {} в закодированных данных, вы можете использовать Хак, таких как:

json_encode (json_decode ("{}"));

хотя это утомительно и некрасиво, я предполагаю / надеюсь, что json_encode/json_decode совместим с одним и другим и всегда будет оценивать следующее правда:

$a = <something>;

$a === json_decode (json_encode ($a)); 

Рекомендуемый метод

json_decode ("{}") вернет a stdClass по умолчанию, использование ниже должно считаться безопасным. Хотя, как уже упоминалось, это почти то же самое, что делать (object) null.

json_encode (new stdClass);

если вы используете объекты в качестве динамических словарей (и я думаю, что вы делаете), то я думаю, что вы хотите использовать ArrayObject.

он отображается в словарь JSON, даже когда он пуст. это здорово, если вам нужно различать списки (массивы) и словари (ассоциативные массивы):

$complex = array('list' => array(), 'dict' => new ArrayObject());
print json_encode($complex); // -> {"list":[],"dict":{}}

вы также можете легко манипулировать им (как и с ассоциативным массивом), и он будет правильно отображаться в a словарь:

$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 вхождения в коде (использовать (($foo instanceof ArrayObject) || is_array($foo))).

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

$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($json);

... теперь это настоящий JSON ...

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

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

json_encode($var);

Comments

    Ничего не найдено.