json_encode / json_decode - devuelve stdClass en lugar de Array en PHP

108

Observe este pequeño guión:

$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 json_encodedluego json_decodedproduzca el mismo resultado EXACTO?

Derek Adair
fuente

Respuestas:

145

Echar un vistazo más de cerca el segundo parámetro de json_decode($json, $assoc, $depth)al https://secure.php.net/json_decode

VolkerK
fuente
7
No responde a la pregunta: ¿por qué stdClass es el valor predeterminado? Véase también stackoverflow.com/questions/3193765/…
William Entriken
7
Esto realmente no responde a la pregunta, solo proporciona una solución. Pero una pésima solución, en mi opinión. ¿Qué sucede si desea que los objetos codificados en json se decodifiquen como objetos y las matrices asociativas decodificadas en json se descodifiquen como matrices asociativas, automáticamente? Usar el segundo parámetro para json_decode () implica algún tipo de intervención humana. Francamente, esto es una mierda (de PHP, no de esta respuesta)
JDS
@JDS puede ajustar muy fácilmente esas funciones y crear las suyas propias que almacenen el tipo de fuente en una clave json de forma transparente si es necesario.
sivann
2
@JDS He agregado una respuesta que en realidad responde a la pregunta de "¿Por qué PHP convierte el objeto JSON en una clase?"
7ochem
82
$arrayDecoded = json_decode($arrayEncoded, true);

te da una matriz.

Kai Chan
fuente
2
Esto es muy útil, gracias @Kai Chain. Supongo que la pregunta original era: "¿Por qué?", ​​Pero esto parece llegar a lo que pretendían. Cualquiera que sea el caso, perfecto para mi situación.
Ghukill
¡Y hace el mismo trabajo después de 4 años aquí! Conocimientos básicos que todos deberían estudiar primero, ¡como yo!
KJS
20

Para responder a 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 un poco el ejemplo que ofrece el OP:

$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 del lenguaje de programación ECMAScript ) y, si observa el formato, parece JavaScript. Es un objeto JSON ( {}= objeto ) que tiene una propiedad "cosas" con un valor "cosas" y tiene una propiedad "cosas", siendo su valor una matriz de cadenas ( []= matriz ).

JSON (como JavaScript) no conoce matrices asociativas solo matrices indexadas. Entonces, cuando JSON codifica una matriz asociativa 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 está decodificando en un objeto desconocido, que está stdClassen PHP. Como verá, la matriz de cadenas de "cosas" se decodificará en una matriz PHP indexada.

Ver también:


Gracias a https://www.randomlists.com/things por las 'cosas'

7ochem
fuente
2
esta es la respuesta correcta ... responde la pregunta, mientras que las otras dan soluciones a un problema inexplicable. Gracias, estaba dando vueltas olvidando que JSON no admitía matrices asociativas.
marcus
5

Aunque, como se mencionó, podría agregar un segundo parámetro aquí para indicar que desea que se devuelva una matriz:

$array = json_decode($json, true);

Es posible que muchas personas prefieran emitir los resultados en su lugar:

$array = (array)json_decode($json);

Podría ser más claro de leer.

Andrés
fuente
4
Hay diferentes. Tenga en cuenta si ha codificado una matriz u objeto multidimensional. El primero le da una matriz de matrices, el segundo le da una matriz de objetos.
Héctor
2

tl; dr: JavaScript no admite matrices asociativas, por lo tanto, tampoco JSON.

Después de todo, es JSON, no JSAAN. :)

Entonces PHP tiene que convertir su matriz en un objeto para codificar en JSON.

LaVache
fuente
1
    var_dump(json_decode('{"0":0}'));    // output: object(0=>0)
    var_dump(json_decode('[0]'));          //output: [0]

    var_dump(json_decode('{"0":0}', true));//output: [0]
    var_dump(json_decode('[0]', true));    //output: [0]

Si decodifica el json en una matriz, la información se perderá en esta situación.

bijiDango
fuente
0

También hay una buena biblioteca de codificación / decodificación json de PHP 4 (que es incluso compatible con PHP 5 inversa) 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 Matt Knapp:

cwd
fuente