¿La mejor manera de crear un objeto vacío en JSON con PHP?


93

Para crear un objeto JSON vacío, suelo usar:

json_encode((object) null);

emitir nulo a un objeto funciona, pero ¿hay alguna otra forma preferible y / o algún problema con esta solución?


¿Por qué convertirías nulo en un objeto JSON? Además, ¿no sería el resultado final {}? Podrías hacer eso.
Ayman Safadi

1
(objeto) (matriz ()) tal vez? Tu solución suena bien.
malletjo

1
json_encode()devuelve una cadena, no un objeto. ¿Por qué hacer esto? ¿Me estoy perdiendo de algo?
Telmo Marques

2
bueno, en realidad "{}" sale como una cadena. Quiero un resultado como: {"some_property": {}} que sea un objeto json vacío. Convierto un nulo en objeto porque no conozco ninguna otra solución por ahora;)
pna

Me gusta tu solución 8]
Andrew

Respuestas:


112

Tu solución podría funcionar ...

La documentación especifica que (object) nullresultará en un objeto vacío, por lo que algunos podrían decir que su código es válido y que es el método a usar.

PHP: Objetos - Manual

Si un valor de cualquier otro tipo se convierte en un objeto, se crea una nueva instancia de la clase incorporada stdClass. Si el valor era NULL, la nueva instancia estará vacía.


.. pero, ¡intenta mantenerlo a salvo!

Aunque nunca sabe cuándo / si lo anterior cambiará, por lo que si desea estar 100% seguro de que siempre terminará con un {}en sus datos codificados, puede usar un truco como:

json_encode (json_decode ("{}"));

Aunque es tedioso y feo, asumo / espero que json_encode / json_decode sea compatible con uno y otro y siempre evaluará lo siguiente como verdadero:

$a = <something>;

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

Método recomendado

json_decode ("{}")devolverá un stdClassvalor predeterminado, utilizando lo siguiente si por lo tanto se considera seguro. Aunque, como se mencionó, es más o menos lo mismo que hacer (object) null.

json_encode (new stdClass);

1
después de usar "new ArrayObject ()" o "(object) null" obtengo => "Object" y no '{}' como respuesta. usando php 5.6.29.
rohitmb

81

Si usa objetos como diccionarios dinámicos (y supongo que sí), entonces creo que quiere usar un ArrayObject .

Se asigna al diccionario JSON incluso cuando está vacío. Es genial si necesita distinguir entre listas (matrices) y diccionarios (matrices asociativas):

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

También puede manipularlo sin problemas (como lo haría con una matriz asociativa), y seguirá renderizándose correctamente en un diccionario:

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

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

Si necesita que esto sea 100% compatible en ambos sentidos , también puede ajustar json_decodepara que regrese en ArrayObjectslugar de stdClassobjetos (deberá recorrer el árbol de resultados y reemplazar recursivamente todos los objetos, lo cual es una tarea bastante fácil).

Gotchas . Solo uno que he encontrado hasta ahora: is_array(new ArrayObject())evalúa a false. Necesita buscar y reemplazar is_arrayocurrencias con is_iterable.


5
Esta es la respuesta más correcta aquí, hace exactamente lo que se necesita en este caso
Avi Kapuya

2
Gracias, esta es la mejor respuesta y se adapta exactamente a mis necesidades. Antes de leer esto, mi código comenzaba con jsonResponse = array()y luego se llenaba dinámicamente con un bucle. Si el bucle no tenía una sola iteración, el objeto "vacío" (o diccionario, como usted lo llama) se codificó []mientras que todos los demás casos se codificaron 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 = {}` y no usar json_encode en absoluto es inútil.
user2690527

El gotcha no debería aplicarse - dado que se ArrayObjectimplementa iterable, puede hacer ambas cosas is_iterable($foo)además de usar la iterablesugerencia de tipo en lugar de array, lo que debe hacer de todos modos para tener la opción de pasar instancias de ArrayAccess, por ejemplo.
Moritz Friedrich

¡Frio! Actualizó la respuesta.
wrygiel

17

Bueno, json_encode()simplemente devuelve una cadena de una matriz / objeto / etc. de PHP. Puede lograr el mismo efecto de manera mucho más eficiente haciendo:

$json = '{}';

Realmente no tiene sentido usar una función para lograr esto.

ACTUALIZAR Según las actualizaciones de sus comentarios, puede intentar:

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

Aunque no estoy seguro de que sea mejor que lo que has estado haciendo.


1
no, esa es una cadena con algunos paréntesis dentro, quiero lograr algo como: {"some_properties": {}} ... NO {"some_properties": "{}"} que sea diferente.
pna

Oh mierda, pasé demasiado tiempo escribiendo mi publicación .. 8 minutos demasiado tarde jaja!
Filip Roséen - refp

@refp Jaja es difícil competir con la respuesta enciclopédica :)
rdlowrey

hehe lo siento rdlowrey pero @refp fue muy exhaustivo;)
pna

9

Para crear un objeto vacío en JSON con PHP utilicé

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

que produjo

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

lo cual es necesario, porque luego tengo que hacer esto

if(is_object($json))

5

Siempre lo hago (Object)[];, como:

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

... juega con él en PHP ...

$json = json_encode($json);

... ahora es JSON real ...



Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.