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?
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?
json_encode()
devuelve una cadena, no un objeto. ¿Por qué hacer esto? ¿Me estoy perdiendo de algo?
Respuestas:
La documentación especifica que (object) null
resultará 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.
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.
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));
json_decode ("{}")
devolverá un stdClass
valor 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);
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_decode
para que regrese en ArrayObjects
lugar de stdClass
objetos (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_array
ocurrencias con is_iterable
.
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.
ArrayObject
implementa iterable
, puede hacer ambas cosas is_iterable($foo)
además de usar la iterable
sugerencia 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.
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.
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))
json_encode($array, JSON_FORCE_OBJECT)
lo haré también. ver https://www.php.net/manual/en/function.json-encode.php
json_encode(['a', 'b'], JSON_FORCE_OBJECT)
volvería{"0": "a", "1": "b"}
también puedes usar
$var = ["key" => (object) array()];
json_encode($var);