Intro
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 textuel - donc une chaîne de fantaisie, mais toujours juste une chaîne. Décodez-le en PHP en utilisant json_decode()
.
$data = json_decode($json);
Vous y trouverez peut-être:
Ce sont les choses qui peuvent être encodées en JSON. Ou plus précisément, ce sont des versions PHP des choses qui peuvent être encodées en JSON.
Il n'y a rien de spécial en eux. Ce ne sont pas des "objets JSON" ou des "tableaux JSON". Vous avez décodé le JSON - vous avez maintenant des types PHP de base de tous les jours .
Les objets seront des instances de stdClass , une classe intégrée qui est juste une chose générique qui n'est pas importante ici.
Accès aux propriétés des objets
Vous accédez aux propriétés de l'un de ces objets de la même manière que pour les propriétés publiques non statiques de tout autre objet, par exemple $object->property
.
$json = '
{
"type": "donut",
"name": "Cake"
}';
$yummy = json_decode($json);
echo $yummy->type; //donut
Accès aux éléments du tableau
Vous accédez aux éléments de l'un de ces tableaux de la même manière que 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érer dessus avec foreach
.
foreach ($toppings as $topping) {
echo $topping, "\n";
}
Chocolat glacé avec pépites d'
érable
Ou dérangez-vous avec l'une des fonctions de tableau intégrées de bazillion .
Accès aux éléments imbriqués
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 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
Passer true
comme deuxième argument à json_decode ()
Lorsque vous faites cela, au lieu d'objets, vous obtiendrez des tableaux associatifs - des tableaux avec des chaînes pour les clés. Encore une fois, vous accédez à ses éléments comme d'habitude, par exemple $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
Accès aux éléments du tableau associatif
Lors du décodage d'un objet JSON en un tableau PHP associatif, vous pouvez itérer les clés et les valeurs à l'aide de la foreach (array_expression as $key => $value)
syntaxe, par exemple
$json = '
{
"foo": "foo value",
"bar": "bar value",
"baz": "baz value"
}';
$assoc = json_decode($json, true);
foreach ($assoc as $key => $value) {
echo "The value of key '$key' is '$value'", PHP_EOL;
}
Impressions
La valeur de la clé 'foo' est 'valeur foo'
La valeur de la clé 'bar' est 'valeur bar'
La valeur de la clé 'baz' est 'valeur baz'
Je ne sais pas comment les données sont structurées
Lisez la documentation pour savoir de quoi vous obtenez le JSON.
Regardez le JSON - où vous voyez des crochets {}
attendre un objet, où vous voyez des crochets []
attendre un tableau.
Frappez 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 indiquera où vous avez des objets, où vous avez des tableaux, ainsi que les noms et les valeurs de leurs membres.
Si vous ne pouvez aller aussi loin avant de vous perdre - allez aussi loin et frappez -le avec print_r()
:
print_r($yummy->toppings[0]);
stdClass Object
(
[id] => 5002
[type] => Glazed
)
Jetez-y un œil dans cet explorateur JSON interactif pratique .
Décomposez le problème en morceaux plus faciles à envelopper la tête.
json_decode()
Retour null
Cela se produit parce que:
- Le JSON est entièrement constitué de tout cela,
null
.
- Le JSON n'est pas valide - vérifiez le résultat
json_last_error_msg
ou passez-le par quelque chose comme JSONLint .
- Il contient des éléments imbriqués à plus de 512 niveaux de profondeur. Cette profondeur maximale par défaut peut être remplacée en passant un entier comme troisième argument à
json_decode()
.
Si vous devez modifier la profondeur maximale, vous résolvez probablement le mauvais 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 évitez que cela ne se produise.
Le nom de la propriété d'objet contient un caractère spécial
Parfois, vous aurez un nom de propriété d'objet qui contient 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 y remédier.
$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 des objets avec des noms comme des entiers? comme référence.
Quelqu'un a mis JSON dans votre JSON
C'est ridicule mais ça arrive - il y a du JSON encodé comme une chaîne dans votre JSON. Décodez, accédez à la chaîne comme d'habitude, décodez -le et finissez par obtenir 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
Les données ne tiennent pas en mémoire
Si votre JSON est trop volumineux pour json_decode()
être géré immédiatement, les choses commencent à devenir délicates. Voir:
Comment trier
Voir: Référence: toutes les méthodes de base pour trier les tableaux et les données en PHP .