Error “No se puede usar el objeto de tipo stdClass como matriz”

5 minutos de lectura

Avatar de usuario de Dail
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?

  • $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

Avatar de usuario de Jon
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

Avatar de usuario de JiNexus
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 el if 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

Avatar de usuario de Sander Marechal
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.

Avatar de usuario de Alexey Lysenko
Aleksey Lysenko

Tengo el mismo problema hoy y lo resolví así:

si llamas json_decode($somestring)obtendrá un Objeto y necesita acceder como $object->keypero 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

Avatar de usuario de Peter Mortensen
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.

  1. Echa el objeto a la matriz.

    Esto se puede lograr de la siguiente manera.

    $a = (array)$object;
    
  2. 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 trueconvertirá 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

¿Ha sido útil esta solución?