json_encode / json_decode - renvoie stdClass au lieu de Array en PHP

108

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 qui est json_encodedalors ne devrait-il pas json_decodeddonner le même résultat EXACT?

Derek Adair
la source

Réponses:

146

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

VolkerK
la source
7
Ne répond pas à la question - pourquoi une stdClass est-elle la valeur par défaut? Voir aussi stackoverflow.com/questions/3193765/…
William Entriken
7
Cela ne répond vraiment pas à la question, cela fournit simplement une solution de contournement. Mais une mauvaise solution de contournement, l'OMI. Que faire si vous voulez que les objets codés json soient décodés en tant qu'objets et que les tableaux associatifs décodés json soient décodés automatiquement en tant que tableaux associatifs? L'utilisation du deuxième paramètre de json_decode () implique une sorte d'intervention humaine. Franchement, c'est nul (de PHP, pas de cette réponse)
JDS
@JDS vous pouvez très facilement encapsuler ces fonctions et créer les vôtres qui stockent le type de source dans une clé json de manière transparente si vous en avez besoin.
sivann
2
@JDS J'ai ajouté une réponse qui répond en fait à la question "Pourquoi PHP transforme-t-il l'objet JSON en classe?"
7ochem
82
$arrayDecoded = json_decode($arrayEncoded, true);

vous donne un tableau.

Kai Chan
la source
2
Ceci est terriblement utile, merci @Kai Chain - Je suppose que la question originale se posait, "Pourquoi", mais cela semble arriver à ce qu'ils voulaient. Quoi qu'il en soit, parfait pour ma situation.
ghukill
Et fait le même travail après 4 ans ici! Des connaissances de base que tout le monde devrait étudier en premier, comme moi!
KJS
21

Pour répondre à la question réelle:

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

Regardez de plus près la sortie du JSON encodé, j'ai étendu un peu l'exemple que l'OP donne un peu:

$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 objet JSON ( {}= objet ) ayant une propriété "stuff" avec la valeur "things" et une propriété "things" avec sa valeur étant un tableau de chaînes ( []= array ).

JSON (en tant que JavaScript) ne connaît pas les tableaux associatifs uniquement les tableaux indexés. Ainsi, lorsque JSON encodera un tableau associatif PHP, cela se traduira par une chaîne JSON contenant ce tableau comme un "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 stdClassen PHP. Comme vous le verrez, le tableau de chaînes "choses" va se décoder en un tableau PHP indexé.

Regarde aussi:


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

7ochem
la source
2
c'est la bonne réponse ... elle répond à la question, tandis que les autres donnent des contournements à un problème inexpliqué. Merci, j'allais en rond en oubliant que JSON ne supportait pas les tableaux associatifs!
marcus
5

Bien que, comme mentionné, vous puissiez ajouter un deuxième paramètre ici pour indiquer que vous souhaitez qu'un tableau soit renvoyé:

$array = json_decode($json, true);

De nombreuses personnes pourraient préférer diffuser les résultats à la place:

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

Cela pourrait être plus clair à lire.

Andrew
la source
4
Ils sont différents. Soyez conscient si vous avez encodé un tableau ou un objet multidimensionnel. Le premier vous donne un tableau de tableaux, le second vous donne un tableau d'objets.
Hector
2

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

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

PHP doit donc convertir votre tableau en objet pour encoder en JSON.

LaVache
la source
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 vous décodez le json en tableau, les informations seront perdues dans cette situation.

bijiDango
la source