2011-03-02 12 views
287

Estoy tratando de decodificar una cadena JSON en una matriz, pero me sale el siguiente error.json_decode a la matriz

Fatal error: Cannot use object of type stdClass as array in C:\wamp\www\temp\asklaila.php on line 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']); 
?> 

Respuesta

576

Según the documentation, es necesario especificar si desea una matriz asociativa en lugar de un objeto desde json_decode, este sería el código:

json_decode($jsondata, true); 
+1

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

+23

Plantea la pregunta. "Hacer una pregunta" significa asumir algo que aún no se ha probado ([ref] (http: // en.wikipedia.org/wiki/Begging_the_question)). En cualquier caso, la ventaja podría ser que el OP es más cómodo para atravesar matrices que objetos, o que algún otro código ya implementado requiere una matriz. – jamesnotjim

+3

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

34

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

Esto también cambiará en una matriz:

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

Esto es un desperdicio de CPU/Memoria, como se sugiere 'json_decode ($ object, true);' the 'true' hace exactamente lo mismo, internamente mucho más rápido. – TCB13

+1

@ TCB13 excepto si necesita ambos y no desea ejecutar la decodificación de nuevo –

+3

Concur con @JimmyKane. Intenté y ejecuté ambas versiones en un ciclo; si necesita tanto el objeto como la matriz (aunque esto debería suceder rara vez), 'json_decode' + casting es un 45% más rápido que ejecutar los dos sabores de' json_decode'. Por otro lado, ambos son tan rápidos que a menos que necesites literalmente * miles * de descodificaciones, la diferencia es insignificante. – LSerni

14

Esta es una contribución tarde, pero hay un caso válido para la fundición json_decode con (array).
considerar lo siguiente:

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

Si $jsondata siempre se devuelve como una cadena vacía (como en mi experiencia es a menudo), json_decode volverá NULL, resultando en el error Advertencia: Argumento no válido para el suministro foreach () en la línea 3. Se podría añadir una línea de código a continuación si/o un operador ternario, pero En mi opinión está más limpia simplemente cambiar a la línea 2 ...

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

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

0

en PHP json_decode convertir los datos JSON en PHP asociado gama
Por Ej: $php-array= json_decode($json-data, true); print_r($php-array);

1

Inténtelo este

<?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']); 
?> 
0

Trate de esta manera:

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

json_decode apoyo segundo argumento, cuando se establece en TRUE, devolverá un Array en lugar de stdClass Object. Consulte la página Manual de la función json_decode para ver todos los argumentos admitidos 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!