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.
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:
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.
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.
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:
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
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"}
json_encode()
retorna uma String, não um objeto. Por que fazer isso? Estou faltando alguma coisa aqui?Respostas:
Sua solução pode funcionar ..
A documentação especifica que
(object) null
resultará em um objeto vazio, alguns podem dizer que seu código é válido e que é o método a ser usado... 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: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:
Método recomendado
json_decode ("{}")
retornará umstdClass
por padrão, usando o abaixo deve, portanto, ser considerado seguro. Embora, como mencionado, seja praticamente a mesma coisa que fazer(object) null
.fonte
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):
Você também pode manipulá-lo perfeitamente (como faria com uma matriz associativa) e ele continuará sendo renderizado corretamente em um dicionário:
Se você precisa que isso seja 100% compatível nos dois sentidos , você também pode embrulhar
json_decode
para que ele retorne aoArrayObjects
invés destdClass
objetos (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 parafalse
. Você precisa localizar e substituir asis_array
ocorrências poris_iterable
.fonte
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.ArrayObject
implementaiterable
, você pode fazer as duas coisasis_iterable($foo)
e também usar aiterable
dica de tipo em vez dearray
, o que você deve fazer de qualquer maneira para ter a opção de passar instâncias deArrayAccess
, por exemplo.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: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:
Embora eu não tenha certeza de que isso seja melhor do que o que você tem feito.
fonte
Para criar um objeto vazio em JSON com PHP eu usei
que produziu
o que é necessário, porque depois eu tenho que fazer isso
fonte
Eu sempre faço
(Object)[];
, tipo:... brinque com isso em PHP ...
... agora é JSON real ...
fonte
json_encode($array, JSON_FORCE_OBJECT)
vai fazer isso também. consulte https://www.php.net/manual/en/function.json-encode.phpfonte
json_encode(['a', 'b'], JSON_FORCE_OBJECT)
voltaria{"0": "a", "1": "b"}
você também pode usar
fonte