ejemplo - json_encode/json_decode-devuelve stdClass en lugar de Array en PHP
return json php (6)
Observe este pequeño guion:
$array = array(''stuff'' => ''things'');
print_r($array);
//prints - Array ( [stuff] => things )
$arrayEncoded = json_encode($array);
echo $arrayEncoded . "<br />";
//prints - {"stuff":"things"}
$arrayDecoded = json_decode($arrayEncoded);
print_r($arrayDecoded);
//prints - stdClass Object ( [stuff] => things )
¿Por qué PHP convierte el objeto JSON en una clase?
¿No debería una matriz que está json_encoded
json_decoded
rendir el mismo resultado EXACTO?
Para responder la pregunta real:
¿Por qué PHP convierte el objeto JSON en una clase?
Eche un vistazo más de cerca a la salida del JSON codificado, he extendido el ejemplo que OP está dando un poco:
$array = array(
''stuff'' => ''things'',
''things'' => array(
''controller'', ''playing card'', ''newspaper'', ''sand paper'', ''monitor'', ''tree''
)
);
$arrayEncoded = json_encode($array);
echo $arrayEncoded;
//prints - {"stuff":"things","things":["controller","playing card","newspaper","sand paper","monitor","tree"]}
El formato JSON se derivó del mismo estándar que JavaScript ( estándar de lenguaje de programación ECMAScript ) y si se mira el formato se parece a JavaScript. Es un objeto JSON ( {}
= objeto ) que tiene una propiedad "cosas" con valor "cosas" y tiene una propiedad "cosas" cuyo valor es una matriz de cadenas ( []
= matriz ).
JSON (como JavaScript) no conoce las matrices asociativas solo las matrices indexadas. Entonces cuando JSON codifica una matriz asociativa de PHP, esto dará como resultado una cadena JSON que contiene esta matriz como un "objeto".
Ahora estamos decodificando el JSON nuevamente usando json_decode($arrayEncoded)
. La función de decodificación no sabe de dónde se originó esta cadena JSON (una matriz de PHP) por lo que se está decodificando en un objeto desconocido, que es stdClass
en PHP. Como verá, la matriz de "cosas" de cadenas se decodificará en una matriz indexada de PHP.
Ver también:
- RFC 4627 - Tipo de medio de aplicación / json para objeto JavaScript
- RFC 7159 - Intercambio de datos de notación de objetos JavaScript (JSON)
- PHP Manual - Arrays
Gracias a https://www.randomlists.com/things por las ''cosas''
Aunque, como se mencionó, puede agregar un segundo parámetro aquí para indicar que desea que se devuelva una matriz:
$array = json_decode($json, true);
Muchas personas pueden preferir lanzar los resultados en su lugar:
$array = (array)json_decode($json);
Puede ser más claro para leer.
Eche un vistazo más de cerca al segundo parámetro de json_decode($json, $assoc, $depth)
en http://docs.php.net/json_decode
También hay una buena biblioteca de codificación / decodificación de PHP 4 json (que incluso es compatible inversamente con PHP 5) escrita en esta publicación de blog: Uso de json_encode () y json_decode () en PHP4 (junio de 2009) .
El código concreto es de Michal Migurski y de Matt Knapp:
- JSON-PHP / enero de 2005
- Código: http://mike.teczno.com/JSON/JSON.phps
- Propuesta de pera: http://pear.php.net/pepr/pepr-proposal-show.php?id=198
- Paquete de pera: http://pear.php.net/package/Services_JSON
tl; dr: JavaScript no admite matrices asociativas, por lo tanto, tampoco lo hace JSON.
Después de todo, es JSON, no JSAAN. :)
Entonces PHP tiene que convertir su matriz en un objeto para codificar en JSON.
$arrayDecoded = json_decode($arrayEncoded, true);
te da una matriz.