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?
Examinez de plus près le deuxième paramètre de json_decode($json, $assoc, $depth)
dans https://secure.php.net/json_decode
$arrayDecoded = json_decode($arrayEncoded, true);
vous donne un tableau.
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"
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.
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.
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:
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.