¿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.
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:
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.
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):
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.
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:
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é
Gracias ... Pero, tenga en cuenta que esta solución también convierte una matriz no indexada en un objeto con pares clave-valor. Por ejemplo: json_encode(['a', 'b'], JSON_FORCE_OBJECT)volvería{"0": "a", "1": "b"}
json_encode()
devuelve una cadena, no un objeto. ¿Por qué hacer esto? ¿Me estoy perdiendo de algo?Respuestas:
Tu solución podría funcionar ...
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... 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: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:
Método recomendado
json_decode ("{}")
devolverá unstdClass
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
.fuente
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):
También puede manipularlo sin problemas (como lo haría con una matriz asociativa), y seguirá renderizándose correctamente en un diccionario:
Si necesita que esto sea 100% compatible en ambos sentidos , también puede ajustar
json_decode
para que regrese enArrayObjects
lugar destdClass
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 afalse
. Necesita buscar y reemplazaris_array
ocurrencias conis_iterable
.fuente
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
implementaiterable
, puede hacer ambas cosasis_iterable($foo)
además de usar laiterable
sugerencia de tipo en lugar dearray
, lo que debe hacer de todos modos para tener la opción de pasar instancias deArrayAccess
, 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:Realmente no tiene sentido usar una función para lograr esto.
ACTUALIZAR Según las actualizaciones de sus comentarios, puede intentar:
Aunque no estoy seguro de que sea mejor que lo que has estado haciendo.
fuente
Para crear un objeto vacío en JSON con PHP utilicé
que produjo
lo cual es necesario, porque luego tengo que hacer esto
fuente
Siempre lo hago
(Object)[];
, como:... juega con él en PHP ...
... ahora es JSON real ...
fuente
json_encode($array, JSON_FORCE_OBJECT)
lo haré también. ver https://www.php.net/manual/en/function.json-encode.phpfuente
json_encode(['a', 'b'], JSON_FORCE_OBJECT)
volvería{"0": "a", "1": "b"}
también puedes usar
fuente