print - recorrer json php
¿No se puede usar el objeto de tipo stdClass como matriz? (13)
Me sale un error extraño al usar json_decode()
. Decodifica correctamente los datos (lo vi usando print_r
), pero cuando intento 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 intenté hacer: $result[''context'']
donde $result
tiene los datos devueltos por json_decode()
¿Cómo puedo leer valores dentro de esta matriz?
Aquí está la firma de la función:
mixed json_decode ( string $json [, bool $assoc = false [, int $depth = 512 [, int $options = 0 ]]] )
Cuando param es falso, que es el predeterminado, devolverá un tipo de php apropiado. Obtienes el valor de ese tipo usando el paradigma object.method.
Cuando param es verdadero, devolverá matrices asociativas.
Devolverá NULL en caso de error.
Si desea obtener un valor a través de una matriz, establezca assoc en verdadero.
Cambiarlo por
$results->fetch_array()
Como dice el Manual de PHP ,
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 se deben pasar dentro de print_r()
deben 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.
Convertir el objeto a la matriz.
Esto se puede lograr de la siguiente manera.$a = (array)$object;
Accediendo a la clave del Objeto.
Como se mencionó anteriormente, cuando usasjson_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 arrays anidados.
$value = $object->key1->key2->key3...;
También hay otras opciones para print_r()
, como var_dump();
y var_export();
PS : Además, si configura el segundo parámetro de json_decode();
a true
, convertirá automáticamente el objeto a una 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
Cuando intenta acceder a él como $result[''context'']
, lo trata como una matriz, el error le indica que en realidad está tratando con un objeto, entonces debería acceder a él como $result->context
Debes acceder a él usando ->
ya que es un objeto.
Cambia tu código desde:
$result[''context''];
A:
$result->context;
La función json_decode()
devuelve un objeto por defecto.
Puede acceder a los datos de esta manera:
var_dump($result->context);
Si tiene identificadores como from-date
(el guión causaría un error de PHP al usar el método anterior) tiene que 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);
No es una matriz, es un objeto de tipo stdClass.
Se puede acceder así:
echo $oResult->context;
Más información aquí: ¿Qué es stdClass en PHP?
Obtuve este error de la nada porque el inicio de sesión de mi facebook repentinamente dejó de funcionar (también cambié de host) y arrojé este error. La solución es muy fácil.
El problema estaba en este código.
$response = (new FacebookRequest(
FacebookSession::newAppSession($this->appId, $this->appSecret),
''GET'',
''/oauth/access_token'',
$params
))->execute()->getResponse(true);
if (isset($response[''access_token''])) { <---- this line gave error
return new FacebookSession($response[''access_token'']);
}
Básicamente, la función isset () espera una matriz pero en su lugar encuentra un objeto. La solución simple es convertir el objeto PHP a un array utilizando el cuantificador (array) . El siguiente es el código fijo.
$response = (array) (new FacebookRequest(
FacebookSession::newAppSession($this->appId, $this->appSecret),
''GET'',
''/oauth/access_token'',
$params
))->execute()->getResponse(true);
Note el uso del cuantificador off array () en la primera línea.
Puedes convertir el objeto stdClass en una matriz como:
$array = (array)$stdClass;
Ten el mismo problema hoy, resuelto así:
Si llamas a json_decode($somestring)
obtendrás un Objeto y necesitas acceder como $object->key
, pero si llamas a json_decode($somestring, true)
obtendrás un diccionario y podrás acceder como $array[''key'']
Use true
como el segundo parámetro para json_decode
. Esto decodificará el json en una matriz asociativa en lugar de instancias stdObject
:
$my_array = json_decode($my_json, true);
Consulte json_decode() para más detalles.
Use el segundo parámetro de json_decode
para hacer que devuelva una matriz:
$result = json_decode($data, true);
en lugar de usar los corchetes, use el operador del objeto, por ejemplo, mi matriz basada en el objeto de la base de datos se crea así en una clase llamada DB:
class DB {
private static $_instance = null;
private $_pdo,
$_query,
$_error = false,
$_results,
$_count = 0;
private function __construct() {
try{
$this->_pdo = new PDO(''mysql:host='' . Config::get(''mysql/host'') .'';dbname='' . Config::get(''mysql/db'') , Config::get(''mysql/username'') ,Config::get(''mysql/password'') );
} catch(PDOException $e) {
$this->_error = true;
$newsMessage = ''Sorry. Database is off line'';
$pagetitle = ''Teknikal Tim - Database Error'';
$pagedescription = ''Teknikal Tim Database Error page'';
include_once ''dbdown.html.php'';
exit;
}
$headerinc = ''header.html.php'';
}
public static function getInstance() {
if(!isset(self::$_instance)) {
self::$_instance = new DB();
}
return self::$_instance;
}
public function query($sql, $params = array()) {
$this->_error = false;
if($this->_query = $this->_pdo->prepare($sql)) {
$x = 1;
if(count($params)) {
foreach($params as $param){
$this->_query->bindValue($x, $param);
$x++;
}
}
}
if($this->_query->execute()) {
$this->_results = $this->_query->fetchAll(PDO::FETCH_OBJ);
$this->_count = $this->_query->rowCount();
}
else{
$this->_error = true;
}
return $this;
}
public function action($action, $table, $where = array()) {
if(count($where) ===3) {
$operators = array(''='', ''>'', ''<'', ''>='', ''<='');
$field = $where[0];
$operator = $where[1];
$value = $where[2];
if(in_array($operator, $operators)) {
$sql = "{$action} FROM {$table} WHERE {$field} = ?";
if(!$this->query($sql, array($value))->error()) {
return $this;
}
}
}
return false;
}
public function get($table, $where) {
return $this->action(''SELECT *'', $table, $where);
public function results() {
return $this->_results;
}
public function first() {
return $this->_results[0];
}
public function count() {
return $this->_count;
}
}
Para acceder a la información, uso este código en el script del controlador:
<?php
$pagetitle = ''Teknikal Tim - Service Call Reservation'';
$pagedescription = ''Teknikal Tim Sevice Call Reservation Page'';
require_once $_SERVER[''DOCUMENT_ROOT''] .''/core/init.php'';
$newsMessage = ''temp message'';
$servicecallsdb = DB::getInstance()->get(''tt_service_calls'', array(''UserID'',
''='',''$_SESSION[''UserID'']));
if(!$servicecallsdb) {
// $servicecalls[] = array(''ID''=>'''',''ServiceCallDescription''=>''No Service Calls'');
} else {
$servicecalls = $servicecallsdb->results();
}
include ''servicecalls.html.php'';
?>
luego, para mostrar la información que verifico para ver si se ha establecido servicecalls y tiene un conteo mayor que 0, recuerde que no es una matriz a la que hago referencia, así que accedo a los registros con el operador de objetos "->" de esta manera:
<?php include $_SERVER[''DOCUMENT_ROOT''] .''/includes/header.html.php'';?>
<!--Main content-->
<div id="mainholder"> <!-- div so that page footer can have a minum height from the
header -->
<h1><?php if(isset($pagetitle)) htmlout($pagetitle);?></h1>
<br>
<br>
<article>
<h2></h2>
</article>
<?php
if (isset($servicecalls)) {
if (count ($servicecalls) > 0){
foreach ($servicecalls as $servicecall) {
echo ''<a href="/servicecalls/?servicecall='' .$servicecall->ID .''">''
.$servicecall->ServiceCallDescription .''</a>'';
}
}else echo ''No service Calls'';
}
?>
<a href="/servicecalls/?new=true">Raise New Service Call</a>
</div> <!-- Main content end-->
<?php include $_SERVER[''DOCUMENT_ROOT''] .''/includes/footer.html.php''; ?>