json_decode a array


422

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 en C: \ wamp \ www \ temp \ asklaila.php en la línea 6

Aquí está el código:

<?php
$json_string = 'http://www.domain.com/jsondata.json';

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

1
Hubiera funcionado si hubiera accedido con $ob->Result.
lapin

Respuestas:


839

Según la documentación , debe especificar si desea una matriz asociativa en lugar de un objeto json_decode, este sería el código:

json_decode($jsondata, true);

44
Se plantea la pregunta, ¿cuáles son las ventajas de que regrese como una matriz y no como un objeto?
Foxinni

52
Plantea la pregunta. "Hacer una pregunta" significa asumir algo que queda por probar ( ref ). En cualquier caso, la ventaja podría ser que el OP es más cómodo para recorrer matrices que objetos, o que algún otro código ya implementado requiere una matriz.
jamesnotjim

8
@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?
David Mann

77
De hecho, podría @DavidMann. Touché!
jamesnotjim

8
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

45

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);

27

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

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

Si $jsondataalguna vez se devuelve como una cadena vacía (como en mi experiencia a menudo lo es), json_decoderegresará NULL, lo que dará como resultado el error Advertencia: argumento no válido proporcionado para foreach () en la línea 3 . Puede agregar una línea de código if / then o un operador ternario, pero IMO es más limpio simplemente cambiar la línea 2 a ...

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

... a menos que esté json_decodeutilizando millones de matrices grandes a la vez, en cuyo caso, como señala @ TCB13, el rendimiento podría verse afectado negativamente.



6

De acuerdo con la función de documentación de PHP json_decode , tiene un parámetro denominado assoc que convierte los objetos devueltos en matrices asociativas

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

Como el parámetro assoc es el FALSEpredeterminado, debe establecer este valor TRUEen para recuperar una matriz.

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

$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)
}

5

Esto también lo cambiará a una matriz:

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

66
Este desperdicio de CPU / memoria, como lo sugiere json_decode($object, true);la truehace exactamente lo mismo, internamente mucho más rápido.
TCB13

1
@ TCB13, excepto si necesita ambos y no desea volver a ejecutar la decodificación
Jimmy Kane

3
Concurre con @JimmyKane. Intenté y ejecuté ambas versiones en un ciclo; si necesita tanto el objeto como la matriz (¿aunque esto debería suceder raramente?), json_decode+ lanzar es un 45% más rápido que ejecutar ambos tipos json_decode. Por otro lado, ambos son tan rápidos que, a menos que necesite literalmente miles de decodificaciones, la diferencia es insignificante.
LSerni

4

json_decodeadmite segundo argumento, cuando se establece en TRUEdevolverá un en Arraylugar de stdClass Object. Consulte la página de función Manualjson_decode para ver todos los argumentos compatibles y sus detalles.

Por ejemplo, intente esto:

$json_string = 'http://www.example.com/jsondata.json';
$jsondata = file_get_contents($json_string);
$obj = json_decode($jsondata, TRUE); // Set second argument as TRUE
print_r($obj['Result']); // Now this will works!

3
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 la json_decodefunción.


3

Espero que esto ayude

$json_ps = '{"courseList":[  
            {"course":"1", "course_data1":"Computer Systems(Networks)"},  
            {"course":"2", "course_data2":"Audio and Music Technology"},  
            {"course":"3", "course_data3":"MBA Digital Marketing"}  
        ]}';

Utilice la función de decodificación Json

$json_pss = json_decode($json_ps, true);

Bucle sobre matriz JSON en php

foreach($json_pss['courseList'] as $pss_json)
{

    echo '<br>' .$course_data1 = $pss_json['course_data1']; exit; 

}

Resultado : Sistemas informáticos (redes)


2

en PHP json_decode convierte datos json en una matriz asociada a PHP.
Por ejemplo:$php-array= json_decode($json-data, true); print_r($php-array);


2

Por favor intente esto

<?php
$json_string = 'http://www.domain.com/jsondata.json';

$jsondata = file_get_contents($json_string);
$obj = json_decode($jsondata, true);
echo "<pre>"; print_r($obj['Result']);
?>

2

Intenta así:

$json_string = 'https://example.com/jsondata.json';
$jsondata = file_get_contents($json_string);
$obj = json_decode($jsondata);
print_r($obj->Result);
foreach($obj->Result as $value){
  echo $value->id; //change accordingly
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.