Use json_decode () para crear una matriz en lugar de un objeto

3 minutos de lectura

Avatar de usuario de Harsha MV
Harsha MV

Estoy tratando de decodificar una cadena JSON en una matriz, pero aparece el siguiente error.

Error fatal: no se puede usar el objeto de tipo stdClass como matriz

Aquí está el código:

$json_string = 'http://www.example.com/jsondata.json';

$jsondata = file_get_contents($json_string);
$obj = json_decode($jsondata);
print_r($obj['Result']);

  • Habría funcionado si accedieras con $ob->Result en cambio.

    – lapin

    26 de abril de 2018 a las 7:56

Avatar de usuario de Stephen
Esteban

según la documentacióndebe especificar true como segundo argumento si desea una matriz asociativa en lugar de un objeto de json_decode. Este sería el código:

$result = json_decode($jsondata, true);

Si quieres integer claves en lugar de los nombres de las propiedades:

$result = array_values(json_decode($jsondata, true));

Sin embargo, con su decodificación actual, solo accede a ella como un objeto:

print_r($obj->Result);

  • Plantea la pregunta, ¿cuáles son las ventajas de que regrese como una matriz y no como un objeto?

    – Foxinni

    16 de agosto de 2012 a las 13:31

  • Plantea la pregunta. Para “pedir una pregunta” significa asumir algo que queda por probar (árbitro). En cualquier caso, la ventaja podría ser que el OP se sienta más cómodo atravesando matrices que objetos, o que algún otro código, ya implementado, requiera una matriz.

    – jamesnotjim

    06/03/2013 a las 15:31


  • @jamesnotjim La implementación predeterminada que devuelve un objeto podría plantear la pregunta de que los objetos son mejores valores de retorno que las matrices, ¿no es así?

    –David Mann

    13 de noviembre de 2013 a las 2:43

  • De hecho, podría @DavidMann. ¡Touché!

    – jamesnotjim

    13 de noviembre de 2013 a las 18:53

  • Agregaría el comentario (aunque años después) de que no hay posibilidad de que JSON contenga nada más que datos, lo que hace que esta sea una opción “predeterminada” confusa.

    – Barry

    25 de julio de 2016 a las 16:13

avatar de usuario de xkeshav
xkeshav

prueba esto

$json_string = 'http://www.domain.com/jsondata.json';
$jsondata = file_get_contents($json_string);
$obj = json_decode($jsondata,true);
echo "<pre>";
print_r($obj);

Esta es una contribución tardía, pero hay un caso válido para el casting. json_decode con (array).
Considera lo siguiente:

$jsondata="";
$arr = json_decode($jsondata, true);
foreach ($arr as $k=>$v){
    echo $v; // etc.
}

Si $jsondata alguna vez se devuelve como una cadena vacía (como en mi experiencia suele ser), json_decode regresará NULLresultando en el error Advertencia: Se proporcionó un argumento no válido para foreach() en la línea 3. Puede agregar una línea de código si/entonces o un operador ternario, pero en mi opinión, es más limpio simplemente cambiar la línea 2 a…

$arr = (array) json_decode($jsondata,true);

… a menos que seas json_decodeing millones de arreglos grandes a la vez, en cuyo caso, como señala @ TCB13, el rendimiento podría verse afectado negativamente.

En caso de que esté trabajando en php menos de 5.2, puede usar este recurso.

http://techblog.willshouse.com/2009/06/12/using-json_encode-and-json_decode-in-php4/

http://mike.teczno.com/JSON/JSON.phps

De acuerdo con la Documentación PHP json_decode función tiene un parámetro llamado asociado que convierten los objetos devueltos en matrices asociativas

 mixed json_decode ( string $json [, bool $assoc = FALSE ] )

Desde asociado el parámetro es FALSE de forma predeterminada, debe establecer este valor en TRUE para recuperar una matriz.

Examine el siguiente código para ver una implicación de ejemplo:

$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
var_dump(json_decode($json));
var_dump(json_decode($json, true));

que salidas:

object(stdClass)#1 (5) {
    ["a"] => int(1)
    ["b"] => int(2)
    ["c"] => int(3)
    ["d"] => int(4)
    ["e"] => int(5)
}

array(5) {
    ["a"] => int(1)
    ["b"] => int(2)
    ["c"] => int(3)
    ["d"] => int(4)
    ["e"] => int(5)
}

avatar de usuario de coreyavis
coreyavis

Esto también lo cambiará a una matriz:

<?php
    print_r((array) json_decode($object));
?>

Avatar de usuario de Avinash Singh
avinash singh

json_decode($data, true); // Returns data in array format 

json_decode($data); // Returns collections 

Entonces, si desea una matriz, puede pasar el segundo argumento como ‘verdadero’ en json_decode función.

¿Ha sido útil esta solución?