Il s’agit d’une question de référence générale et d’une réponse couvrant un grand nombre de questions sans fin "Comment accéder aux données de mon JSON?". Il est là pour gérer les bases générales du décodage JSON dans PHP et de l’accès aux résultats.
J'ai le JSON:
{
"type": "donut",
"name": "Cake",
"toppings": [
{ "id": "5002", "type": "Glazed" },
{ "id": "5006", "type": "Chocolate with Sprinkles" },
{ "id": "5004", "type": "Maple" }
]
}
Comment décoder ceci dans PHP et accéder aux données résultantes?
Tout d'abord, vous avez une chaîne. JSON n'est pas un tableau, un objet ou une structure de données. JSON est un format de sérialisation basé sur du texte - donc une chaîne élégante, mais toujours juste une chaîne. Décodez-le dans PHP en utilisant json_decode()
.
_ $data = json_decode($json);
_
Vous pourriez y trouver:
Ce sont les choses qui peuvent être encodées en JSON. Ou plus précisément, ce sont les versions de PHP des choses qui peuvent être encodées en JSON.
Il n'y a rien de spécial à leur sujet. Ce ne sont pas des "objets JSON" ou des "tableaux JSON". Vous avez décodé le JSON - vous avez maintenant types de base quotidiens PHP .
Les objets seront des instances de stdClass , une classe intégrée qui est juste un chose générique qui n'est pas important ici.
Vous accédez aux propriétés de l'un de ces objets de la même manière que vous le feriez pour les propriétés non statiques publiques de tout autre objet, par exemple. _$object->property
_.
_$json = '
{
"type": "donut",
"name": "Cake"
}';
$yummy = json_decode($json);
echo $yummy->type; //donut
_
Vous accédez aux éléments de l’un de ces tableaux de la même manière que vous le feriez pour tout autre tableau, par exemple. $array[0]
.
_$json = '
[
"Glazed",
"Chocolate with Sprinkles",
"Maple"
]';
$toppings = json_decode($json);
echo $toppings[1]; //Chocolate with Sprinkles
_
Itérez dessus avec foreach
.
_foreach ($toppings as $topping) {
echo $topping, "\n";
}
_
Vitré
Chocolat avec pépites
Érable
Ou déconner avec l'un des fonctions de tableau bazillion intégrées .
Les propriétés des objets et les éléments des tableaux peuvent être plus d'objets et/ou de tableaux - vous pouvez simplement continuer à accéder à leurs propriétés et à leurs membres comme d'habitude, par exemple. _$object->array[0]->etc
_.
_$json = '
{
"type": "donut",
"name": "Cake",
"toppings": [
{ "id": "5002", "type": "Glazed" },
{ "id": "5006", "type": "Chocolate with Sprinkles" },
{ "id": "5004", "type": "Maple" }
]
}';
$yummy = json_decode($json);
echo $yummy->toppings[2]->id; //5004
_
true
comme deuxième argument de json_decode ()Lorsque vous faites cela, à la place des objets, vous obtenez des tableaux associatifs - des tableaux avec des chaînes pour les clés. De nouveau, vous accédez aux éléments de celle-ci comme d'habitude, par ex. _$array['key']
_.
_$json = '
{
"type": "donut",
"name": "Cake",
"toppings": [
{ "id": "5002", "type": "Glazed" },
{ "id": "5006", "type": "Chocolate with Sprinkles" },
{ "id": "5004", "type": "Maple" }
]
}';
$yummy = json_decode($json, true);
echo $yummy['toppings'][2]['type']; //Maple
_
Lisez la documentation pour tout ce dont vous obtenez le JSON.
Regardez le JSON - où vous voyez des accolades _{}
_ attend un objet, où vous voyez des crochets _[]
_ attend un tableau.
Frapper les données décodées avec un print_r()
:
_$json = '
{
"type": "donut",
"name": "Cake",
"toppings": [
{ "id": "5002", "type": "Glazed" },
{ "id": "5006", "type": "Chocolate with Sprinkles" },
{ "id": "5004", "type": "Maple" }
]
}';
$yummy = json_decode($json);
print_r($yummy);
_
et vérifiez la sortie:
_stdClass Object
(
[type] => donut
[name] => Cake
[toppings] => Array
(
[0] => stdClass Object
(
[id] => 5002
[type] => Glazed
)
[1] => stdClass Object
(
[id] => 5006
[type] => Chocolate with Sprinkles
)
[2] => stdClass Object
(
[id] => 5004
[type] => Maple
)
)
)
_
Il vous dira où vous avez des objets, où vous avez des tableaux, ainsi que les noms et les valeurs de leurs membres.
Si vous ne pouvez vous rendre aussi loin avant de vous perdre, allez aussi loin et frappez ce avec print_r()
:
_print_r($yummy->toppings[0]);
_
_stdClass Object
(
[id] => 5002
[type] => Glazed
)
_
Regardez-le dans cet explorateur JSON interactif très pratique .
Décomposez le problème en morceaux plus faciles à comprendre.
json_decode()
RENVOIE null
Cela se produit parce que:
null
.json_last_error_msg
ou transmettez-le de la même manière que JSONLint .json_decode()
.Si vous devez modifier la profondeur maximale, vous résolvez probablement le problème. Découvrez pourquoi vous obtenez des données si profondément imbriquées (par exemple, le service que vous interrogez qui génère le JSON a un bogue) et faites en sorte que cela ne se produise pas.
Parfois, vous aurez un nom de propriété d'objet contenant quelque chose comme un trait d'union _-
_ ou un signe _@
_ qui ne peut pas être utilisé dans un identificateur littéral. Au lieu de cela, vous pouvez utiliser un littéral de chaîne entre accolades pour le résoudre.
_$json = '{"@attributes":{"answer":42}}';
$thing = json_decode($json);
echo $thing->{'@attributes'}->answer; //42
_
Si vous avez un entier comme propriété, voir: Comment accéder aux propriétés d'objet avec des noms comme des entiers? comme référence.
C'est ridicule, mais ça arrive - il y a JSON encodé comme une chaîne dans votre JSON. Décodez, accédez à la chaîne comme d'habitude, décodez cela , et obtenez finalement ce dont vous avez besoin.
_$json = '
{
"type": "donut",
"name": "Cake",
"toppings": "[{ \"type\": \"Glazed\" }, { \"type\": \"Maple\" }]"
}';
$yummy = json_decode($json);
$toppings = json_decode($yummy->toppings);
echo $toppings[0]->type; //Glazed
_
Si votre JSON est trop volumineux pour que json_decode()
puisse le gérer immédiatement, les choses commencent à devenir difficiles. Voir:
Voir: Référence: toutes les méthodes de base pour trier les tableaux et les données en PHP .
Vous pouvez utiliser json_decode () pour convertir une chaîne json en un objet/tableau PHP.
Par exemple.
Entrée:
$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
var_dump(json_decode($json));
var_dump(json_decode($json, true));
Sortie:
object(stdClass)#1 (5) {
["a"] => int(1)
["b"] => int(2)
["c"] => int(3)
["d"] => int(4)
["e"] => int(5)
}
array(5) {
["a"] => int(1)
["b"] => int(2)
["c"] => int(3)
["d"] => int(4)
["e"] => int(5)
}
Quelques points à retenir:
json_decode
requiert que la chaîne soit valide json
sinon elle retournera NULL
.json_last_error()
peut être utilisé pour déterminer la nature exacte de l'erreur.utf8
ou json_decode
peut provoquer une erreur et ne renvoyer qu'une valeur NULL
.