json_encode / json_decode - restituisce stdClass invece di Array in PHP


108

Osserva questo piccolo script:

$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 )

Perché PHP trasforma l'oggetto JSON in una classe?

Un array che viene json_encodedquindi json_decodedprodotto non dovrebbe produrre lo stesso risultato ESATTO?

Risposte:


145

Dai un'occhiata più da vicino al secondo parametro di json_decode($json, $assoc, $depth)su https://secure.php.net/json_decode


7
Non risponde alla domanda: perché stdClass è l'impostazione predefinita. Vedi anche stackoverflow.com/questions/3193765/…
William Entriken

7
Questo in realtà non risponde alla domanda, fornisce solo una soluzione alternativa. Ma una pessima soluzione alternativa, IMO. E se si desidera che gli oggetti con codifica json vengano decodificati come oggetti e gli array associativi decodificati con json vengano decodificati automaticamente come array associativi? L'uso del secondo parametro di json_decode () implica una sorta di intervento umano. Francamente, questo fa schifo (di PHP, non di questa risposta)
JDS

@JDS puoi facilmente racchiudere queste funzioni e crearne di tue che memorizzano il tipo di sorgente in una chiave json in modo trasparente se necessario.
sivann

2
@JDS Ho aggiunto una risposta che risponde effettivamente alla domanda "Perché PHP trasforma l'oggetto JSON in una classe?"
7ochem

82
$arrayDecoded = json_decode($arrayEncoded, true);

ti dà un array.


2
Questo è così tristemente utile, grazie @Kai Chain - Suppongo che la domanda originale fosse "Perché", ma questo sembra ottenere ciò che intendevano. In ogni caso, perfetto per la mia situazione.
ghukill

E fa lo stesso lavoro dopo 4 anni qui! Conoscenza di base che tutti dovrebbero effettivamente studiare per primi, come me!
KJS

20

Per rispondere alla domanda effettiva:

Perché PHP trasforma l'oggetto JSON in una classe?

Dai un'occhiata più da vicino all'output del JSON codificato, ho esteso un po 'l'esempio che l'OP sta dando:

$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"]}

Il formato JSON è stato derivato dallo stesso standard di JavaScript ( ECMAScript Programming Language Standard ) e se guardi il formato sembra JavaScript. È un oggetto JSON ( {}= oggetto ) avente una proprietà "roba" con valore "cose" e ha una proprietà "cose" il cui valore è un array di stringhe ( []= array ).

JSON (come JavaScript) non conosce gli array associativi solo gli array indicizzati. Quindi, quando JSON codifica un array associativo PHP, questo risulterà in una stringa JSON contenente questo array come un "oggetto".

Ora stiamo decodificando di nuovo il JSON usando json_decode($arrayEncoded). La funzione di decodifica non sa da dove proviene questa stringa JSON (un array PHP), quindi si sta decodificando in un oggetto sconosciuto, che si trova stdClassin PHP. Come vedrai, l'array di stringhe "things" si decodificherà in un array PHP indicizzato.

Vedi anche:


Grazie a https://www.randomlists.com/things per le "cose"


2
questa è la risposta corretta ... risponde alla domanda, mentre gli altri danno soluzioni alternative a un problema inspiegabile. Grazie, stavo girando in tondo dimenticando che JSON non supportava gli array associativi!
marcus

5

Sebbene, come accennato, potresti aggiungere un secondo parametro qui per indicare che desideri restituire un array:

$array = json_decode($json, true);

Molte persone potrebbero preferire invece trasmettere i risultati:

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

Potrebbe essere più chiaro da leggere.


4
Ce ne sono di diversi. Fai attenzione se hai codificato un array o un oggetto multidimensionale. Il primo ti dà un array di array, il secondo ti dà un array di oggetti.
Hector

2

tl; dr: JavaScript non supporta gli array associativi, quindi nemmeno JSON.

Dopo tutto, è JSON, non JSAAN. :)

Quindi PHP deve convertire il tuo array in un oggetto per poterlo codificare in JSON.


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]

Se decodifichi il json in un array, le informazioni andranno perse in questa situazione.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.