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.