web-dev-qa-db-fra.com

json_encode/json_decode - retourne stdClass au lieu de Array dans PHP

Observez ce petit 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 )

Pourquoi PHP transforme-t-il l'objet JSON en classe?

Un tableau json_encoded puis json_decoded ne devrait-il pas donner le même résultat EXACT?

97
Derek Adair

Examinez de plus près le deuxième paramètre de json_decode($json, $assoc, $depth) dans https://secure.php.net/json_decode

136
VolkerK
$arrayDecoded = json_decode($arrayEncoded, true);

vous donne un tableau.

71
Kai Chan

Pour répondre à la question réelle:

Pourquoi PHP transforme-t-il l'objet JSON en classe?

Examinez de plus près la sortie du code JSON encodé. J'ai étendu l'exemple fourni par l'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"]}

Le format JSON est dérivé du même standard que JavaScript (ECMAScript Programming Language Standard) et si vous regardez le format, il ressemble à JavaScript. C'est un JSON objet ({} = objet) ayant une propriété "stuff" avec une valeur "things" et une propriété "things" avec pour valeur un tableau de chaînes ([] = array).

JSON (en JavaScript) ne connaît pas les tableaux associatifs, mais uniquement les tableaux indexés. Ainsi, lorsque JSON encodera un tableau associatif PHP, cela se traduira par une chaîne JSON contenant ce tableau en tant qu '"objet".

Maintenant, nous décodons à nouveau le JSON en utilisant json_decode($arrayEncoded). La fonction de décodage ne sait pas d'où provient cette chaîne JSON (un tableau PHP). Elle est donc décodée en un objet inconnu, qui est stdClass en PHP. Comme vous le verrez, le tableau de chaînes "d'objets" sera décodé dans un tableau indexé PHP.

Regarde aussi:


Merci à https://www.randomlists.com/things pour les "choses"

15
7ochem

Bien que, comme mentionné, vous pouvez ajouter un deuxième paramètre ici pour indiquer que vous voulez un tableau retourné:

$array = json_decode($json, true);

Beaucoup de gens préféreront peut-être utiliser les résultats:

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

Cela pourrait être plus clair à lire.

4
Andrew

tl; dr: JavaScript ne supporte pas les tableaux associatifs, donc JSON non plus. 

Après tout, c'est JSON, pas JSAAN. :)

Donc PHP doit convertir votre tableau en objet pour pouvoir encoder en JSON.

2
LaVache

Il y a aussi une bonne PHP 4 librairie jode encoder/décoder (même PHP 5 compatible inverse) décrite dans ce billet de blog: Using json_encode () et json_decode () en PHP4 (Jun 2009) .

Le code concret est de Michal Migurski et de Matt Knapp: 

0
cwd
    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 vous décodez le JSON en tableau, des informations seront perdues dans cette situation.

0
bijiDango