Día
Recibo un error extraño al usar json_decode()
. Decodifica los datos correctamente (lo vi usando print_r
), pero cuando trato de acceder a la información dentro de la matriz, obtengo:
Fatal error: Cannot use object of type stdClass as array in
C:\Users\Dail\software\abs.php on line 108
Solo traté de hacer: $result['context']
dónde $result
tiene los datos devueltos por json_decode()
¿Cómo puedo leer valores dentro de esta matriz?
Jon
Utilice el segundo parámetro de json_decode
para que devuelva una matriz:
$result = json_decode($data, true);
La función json_decode()
devuelve un objeto por defecto.
Puede acceder a los datos de esta manera:
var_dump($result->context);
Si tienes identificadores como from-date
(el guión causaría un error de PHP al usar el método anterior) debe escribir:
var_dump($result->{'from-date'});
Si quieres una matriz, puedes hacer algo como esto:
$result = json_decode($json, true);
O lanzar el objeto a una matriz:
$result = (array) json_decode($json);
-
Me tomó un tiempo encontrar esto cuando trataba de encontrar una manera de referirme al valor _destroy en php establecido por knockoutjs, así que +1
– deltree
28 de marzo de 2012 a las 2:47
-
¡Esta respuesta es mucho más calificada que la primera respuesta (la más calificada)!
-Mojtaba Rezaeian
5 de diciembre de 2018 a las 7:28
JiNexus
Debes acceder usando ->
ya que es un objeto.
Cambia tu código de:
$result['context'];
A:
$result->context;
-
El problema que tengo es tratar de usar la propiedad en un condicional
if ($result->context = $var)
Esto hace que la propiedad se establezca en var y devuelva verdadero, sin importar.– STWilson
16 de noviembre de 2016 a las 21:28
-
@STWilson, deberías usar un doble igual
==
en tu estado actual estás asignando$var
valor a$result->context
mediante el uso de un solo igual=
. Y elif statement
lo leerá como si estuviera vacío o no, y si el$var
tiene valor, eso significa que no está vacío y siempre devolverá verdadero.– JiNexus
16 de noviembre de 2016 a las 23:26
-
¿Por qué esta página parece indicar que ambas sintaxis están permitidas? php.net/manual/en/sdo.sample.getset.php
– kojow7
8 de enero de 2021 a las 3:37
-
@ kojow7 Si te refieres a esto
$company->departments[0]->name
es porque está accediendo directamente al objeto usando un índice de matriz. La estructura de los datos es que los objetos se almacenan en una matriz.– JiNexus
3 de febrero de 2021 a las 22:40
-
@JiNexus Me refiero a los ejemplos n. ° 1 y n. ° 2 en esa página. El ejemplo #1 dice que puedes usar:
$company->name = 'Acme';
y el Ejemplo #2 dice que puedes usar:$company['name'] = 'UltraCorp';
– kojow7
4 de febrero de 2021 a las 0:13
sander marechal
Usar true
como segundo parámetro para json_decode
. Esto decodificará el contenido JSON en una matriz asociativa en lugar de stdObject
instancias:
$my_array = json_decode($my_json, true);
Ver la documentación para más detalles.
Aleksey Lysenko
Tengo el mismo problema hoy y lo resolví así:
si llamas json_decode($somestring)
obtendrá un Objeto y necesita acceder como $object->key
pero si llamas json_decode($somestring, true)
obtendrá un diccionario y podrá acceder como $array['key']
.
-
¡Esto me ahorró mucho tiempo! No estaba ingresando el parámetro verdadero y tratando de acceder a él como una matriz
– Meeyam
7 dic 2018 a las 23:07
-
salvavidas! Especialmente con
echo json_decode('{"Contains Space":999}', true)['Contains Space'] . "\n";
– Neil Gatenby
23 de noviembre de 2020 a las 9:41
Pedro Mortensen
No es una matriz; es un objeto de tipo stdClass.
Puedes acceder a él así:
echo $oResult->context;
Más información está en ¿Qué es stdClass en PHP?.
-
¡Esto me ahorró mucho tiempo! No estaba ingresando el parámetro verdadero y tratando de acceder a él como una matriz
– Meeyam
7 dic 2018 a las 23:07
-
salvavidas! Especialmente con
echo json_decode('{"Contains Space":999}', true)['Contains Space'] . "\n";
– Neil Gatenby
23 de noviembre de 2020 a las 9:41
como el manual de php decir,
print_r — Imprime información legible por humanos sobre una variable
cuando usamos json_decode();
, obtenemos un objeto de tipo stdClass como tipo de retorno. Los argumentos, que deben pasarse dentro de print_r()
debe ser una matriz o una cadena. Por lo tanto, no podemos pasar un objeto dentro de print_r()
. Encontré 2 maneras de lidiar con esto.
-
Echa el objeto a la matriz.
Esto se puede lograr de la siguiente manera.
$a = (array)$object;
-
Accediendo a la clave del Objeto
Como se mencionó anteriormente, cuando se utiliza
json_decode();
función, devuelve un objeto de stdClass. puede acceder a los elementos del objeto con la ayuda de->
Operador.$value = $object->key;
Uno, también puede usar varias claves para extraer los subelementos en caso de que el objeto tenga matrices anidadas.
$value = $object->key1->key2->key3...;
Hay otras opciones para print_r()
también, como var_dump();
y var_export();
PD : Además, si configura el segundo parámetro del json_decode();
a true
convertirá automáticamente el objeto en un array();
Aquí hay algunas referencias:
http://php.net/manual/en/function.print-r.php
http://php.net/manual/en/function.var-dump.php
http://php.net/manual/en/function.var-export.php
$resultado = json_decode(‘la cadena’, verdadero); Agregar el verdadero devuelve el resultado como una matriz y no como una clase estándar.
– Nepaluz
19/04/2016 a las 20:12
Wow, acabo de hacer una gran palma en la cara. xD Ya usé la función tantas veces, y todavía tropiezo haciendo ese error. 😀
– Sarah multitarea
9 de junio de 2021 a las 14:27