Melhor maneira de criar um objeto vazio em JSON com PHP?

92

Para criar um objeto JSON vazio, geralmente uso:

json_encode((object) null);

converter null para um objeto funciona, mas existe alguma outra forma preferível e / ou algum problema com esta solução?

pna
fonte
Por que você converteria nulo em um objeto JSON? Além disso, o resultado final não seria {}? Você poderia simplesmente fazer isso.
Ayman Safadi
1
(objeto) (array ()) talvez? Sua solução parece boa.
malletjo
1
json_encode()retorna uma String, não um objeto. Por que fazer isso? Estou faltando alguma coisa aqui?
Telmo Marques
2
bem, na verdade "{}" sai como uma string! Eu quero um resultado como: {"some_property": {}} que é um objeto json vazio. Eu converto um nulo em objeto porque não conheço nenhuma outra solução por enquanto;)
pna
Gosto da sua solução 8]
Andrew,

Respostas:

111

Sua solução pode funcionar ..

A documentação especifica que (object) nullresultará em um objeto vazio, alguns podem dizer que seu código é válido e que é o método a ser usado.

PHP: Objetos - Manual

Se um valor de qualquer outro tipo for convertido em um objeto, uma nova instância da classe interna stdClass será criada. Se o valor for NULL, a nova instância estará vazia.


.. mas, tente mantê-lo seguro!

Embora você nunca saiba quando / se o item acima vai mudar, então, se quiser ter 100% de certeza de que sempre terminará com um {}em seus dados codificados, você pode usar um hack como:

json_encode (json_decode ("{}"));

Mesmo que seja tedioso e feio, eu presumo / espero que json_encode / json_decode seja compatível com um e outro e sempre irá avaliar o seguinte como verdadeiro:

$a = <something>;

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

Método recomendado

json_decode ("{}")retornará um stdClasspor padrão, usando o abaixo deve, portanto, ser considerado seguro. Embora, como mencionado, seja praticamente a mesma coisa que fazer (object) null.

json_encode (new stdClass);
Filip Roséen - refp
fonte
1
depois de usar "new ArrayObject ()" ou "(objeto) null" estou recebendo => "Objeto" e não '{}' como resposta. usando php 5.6.29.
rohitmb
81

Se você usa objetos como dicionários dinâmicos (e acho que usa), então acho que você quer usar um ArrayObject .

Ele mapeia no dicionário JSON mesmo quando está vazio. É ótimo se você precisa distinguir entre listas (arrays) e dicionários (arrays associativos):

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

Você também pode manipulá-lo perfeitamente (como faria com uma matriz associativa) e ele continuará sendo renderizado corretamente em um dicionário:

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

unset($complex['dict']['a']);
print json_encode($complex); // -> {"list":[],"dict":{}}

Se você precisa que isso seja 100% compatível nos dois sentidos , você também pode embrulhar json_decodepara que ele retorne ao ArrayObjectsinvés de stdClassobjetos (você precisará percorrer a árvore de resultados e substituir recursivamente todos os objetos, o que é uma tarefa bastante fácil).

Gotchas . Apenas um que encontrei até agora: is_array(new ArrayObject())avalia para false. Você precisa localizar e substituir as is_arrayocorrências por is_iterable.

wrygiel
fonte
5
Esta é a resposta mais correta aqui, ela faz exatamente o que é necessário neste caso
Avi Kapuya
2
Obrigado, esta é a melhor resposta e atende exatamente às minhas necessidades. Antes de ler isso, meu código começou com jsonResponse = array()e depois foi preenchido dinamicamente por um loop. Se o loop não tivesse uma única iteração, o objeto "vazio" (ou dicionário, como você o chama) foi codificado como []enquanto todos os outros casos foram codificados como "{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 = {}` e não usar json_encode é fútil.
user2690527
A pegadinha não deve se aplicar - como ArrayObjectimplementa iterable, você pode fazer as duas coisas is_iterable($foo)e também usar a iterabledica de tipo em vez de array, o que você deve fazer de qualquer maneira para ter a opção de passar instâncias de ArrayAccess, por exemplo.
Moritz Friedrich
Legal! Atualizou a resposta.
wrygiel de
17

Bem, json_encode()simplesmente retorna uma string de um array / objeto / etc PHP. Você pode obter o mesmo efeito com muito mais eficiência fazendo:

$json = '{}';

Realmente não há sentido em usar uma função para fazer isso.

ATUALIZAÇÃO De acordo com as atualizações de seus comentários, você pode tentar:

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

Embora eu não tenha certeza de que isso seja melhor do que o que você tem feito.

rdlowrey
fonte
1
não, isso é uma string com alguns parênteses dentro, eu quero alcançar algo como: {"some_properties": {}} ... NOT {"some_properties": "{}"} que é diferente.
pna
Que merda, passei muito tempo escrevendo meu post .. 8 minutos atrasado haha!
Filip Roséen - refp
@refp Haha difícil competir com a resposta enciclopédica :)
rdlowrey
hehe desculpe rdlowrey mas @refp foi muito exaustivo;)
pna
9

Para criar um objeto vazio em JSON com PHP eu usei

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

que produziu

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

o que é necessário, porque depois eu tenho que fazer isso

if(is_object($json))
snow6oy
fonte
5

Eu sempre faço (Object)[];, tipo:

$json = (Object)[]; // [] could also be array()

... brinque com isso em PHP ...

$json = json_encode($json);

... agora é JSON real ...

Anuga
fonte
2

json_encode($array, JSON_FORCE_OBJECT)vai fazer isso também. consulte https://www.php.net/manual/en/function.json-encode.php

Marc Steven Plotz
fonte
Obrigado ... Mas, tenha em mente que esta solução também converte array não indexado em objeto com pares de valores-chave. Ex: json_encode(['a', 'b'], JSON_FORCE_OBJECT)voltaria{"0": "a", "1": "b"}
Fendi Setiawan
1

você também pode usar

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

json_encode($var);
Rishabh Parashar
fonte