Comment extraire des données de JSON avec PHP?
Il s'agit d'une question de référence générale et d'une réponse couvrant la plupart des interminables "Comment puis-je accéder aux données dans mon JSON?" des questions. Il est là pour gérer les bases générales du décodage JSON en PHP et accéder 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 cela en PHP et accéder aux données résultantes?
Réponses
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 basé sur du texte - donc une chaîne sophistiquée, mais toujours juste une chaîne. Décodez-le en PHP en utilisant json_decode()
.
$data = json_decode($json);
Vous y trouverez peut-être:
- scalaires: chaînes , entiers , flottants et booléens
- nulls (un type spécial qui lui est propre)
- types composés: objets et tableaux .
Ce sont les choses qui peuvent être encodées en JSON. Ou plus précisément, ce sont les versions PHP des éléments qui peuvent être encodés 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 des types PHP de base de tous les jours .
Les objets seront des instances de stdClass , une classe intégrée qui n'est qu'une chose générique qui n'est pas importante ici.
Accéder 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 vous le feriez 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éder aux éléments du tableau
Vous accédez aux éléments de l'un de ces tableaux de la même manière que vous le feriez pour n'importe quel autre tableau, par exemple $array[0]
.
$json = '
[
"Glazed",
"Chocolate with Sprinkles",
"Maple"
]';
$toppings = json_decode($json);
echo $toppings[1]; //Chocolate with Sprinkles
Répétez avec foreach
.
foreach ($toppings as $topping) {
echo $topping, "\n";
}
Chocolat glacé aux pépites d'
érable
Ou jouer avec l'une des fonctions de tableau intégrées bazillion .
Accéder 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 de tableau associatif
Lors du décodage d'un objet JSON en un tableau PHP associatif, vous pouvez itérer à la fois les clés et les valeurs en utilisant 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;
}
Tirages
La valeur de la clé «foo» est «foo value»
La valeur de la clé «bar» est «bar value»
La valeur de la clé «baz» est «baz value»
Je ne sais pas comment les données sont structurées
Lisez la documentation pour tout ce dont vous obtenez le JSON.
Regardez le JSON - où vous voyez des accolades {}
attendent un objet, où vous voyez des crochets []
attendent 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 coup d'œil dans cet explorateur JSON interactif pratique .
Décomposez le problème en morceaux qui sont plus faciles à comprendre.
json_decode()
Retour null
Cela se produit parce que soit:
- 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 sur 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 aussi profondément imbriquées (par exemple, le service que vous interrogez et qui génère le JSON a un bogue) et que cela ne se produise pas.
Le nom de la propriété de l'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 arobase @
qui ne peut pas être utilisé dans un identificateur littéral. Au lieu de cela, vous pouvez utiliser une chaîne littérale 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 d'un objet avec des noms comme des entiers? comme référence.
Quelqu'un a mis JSON dans votre JSON
C'est ridicule mais cela arrive - il y a du JSON encodé sous forme de chaîne dans votre JSON. Décodez, accédez à la chaîne comme d'habitude, décodez -la 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
Les données ne tiennent pas dans la mémoire
Si votre JSON est trop volumineux pour json_decode()
être manipulé immédiatement, les choses commencent à devenir délicates. Voir:
Comment le trier
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 objet / tableau PHP.
Par exemple.
Contribution:
$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
var_dump(json_decode($json));
var_dump(json_decode($json, true));
Production:
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
exige que la chaîne soit validejson
sinon elle retourneraNULL
.- En cas d'échec du décodage,
json_last_error()
peut être utilisé pour déterminer la nature exacte de l'erreur. - Assurez-vous que vous transmettez le
utf8
contenu ou quejson_decode
vous risquez une erreur et renvoyez simplement uneNULL
valeur.
// Using json as php array
$json = '[{"user_id":"1","user_name":"Sayeed Amin","time":"2019-11-06 13:21:26"}]';
//or use from file
//$json = file_get_contents('results.json');
$someArray = json_decode($json, true);
foreach ($someArray as $key => $value) {
echo $value["user_id"] . ", " . $value["user_name"] . ", " . $value["time"] . "<br>";
}
Nous pouvons décoder la chaîne json en tableau en utilisant la fonction json_decode en php
1) json_decode ($ json_string) // il retourne un objet
2) json_decode ($ json_string, true) // renvoie un tableau
$json_string = '{
"type": "donut",
"name": "Cake",
"toppings": [
{ "id": "5002", "type": "Glazed" },
{ "id": "5006", "type": "Chocolate with Sprinkles" },
{ "id": "5004", "type": "Maple" }
]
}';
$array = json_decode($json_string,true);
echo $array['type']; //it gives donut
Envisagez d'utiliser JSONPath
https://packagist.org/packages/flow/jsonpath
Il y a une explication assez claire sur la façon de l'utiliser et d'analyser un fichier JSON en évitant toutes les boucles proposées. Si vous connaissez XPath
pour XML
vous commencerez aimer cette approche.