Dans ce tutoriel nous allons voir comment manipuler un fichier de données JSON avec un script en PHP. Pour utiliser ou manipuler notre fichier JSON le pré requis sera d’avoir installé un serveur web et PHP.
Si vous ne savez pas comment faire, vous pouvez consulter ce tutoriel sur l’installation de WAMP.
Je m’abonne à la chaîne NumelionWeb
Pour ceux qui ne savent pas à quoi correspond exactement un fichier JSON (définition Wikipédia) :
JSON (JavaScript Object Notation) est un format de données textuelles, générique, dérivé de la notation des objets du langage ECMAScript. Il permet de représenter de l’information structurée.
Maintenant, passons aux choses sérieuses, nous allons utiliser le fichier JSON suivant :
{ "response": { "version": "0.9" ,"termsofService": "https://www.numelion.com" ,"features": { "date": "24/09/2013" } }, "cotation_bourse": [ { "bourse": { "heure": "15", "minute": "04" }, "total": { "compagnie": "Total", "cotation": "43,15", "tendance": "+ 1,04"}, "michelin": { "compagnie": "Michelin", "cotation": "82,42", "tendance": "+ 1,20"} }, { "bourse": { "heure": "09", "minute": "04" }, "yahoo": { "compagnie": "Yahoo", "cotation": "30,26", "tendance": "- 1,06"}, "google": { "compagnie": "Google", "cotation": "886,50", "tendance": "- 3,89"} } ] }
Je nomme ce fichier cotation_bourse.json. Ce fichier contient les cotations boursières de plusieurs compagnies. Vu comme cela un fichier de données JSON semble plutôt complexe à décortiquer alors qu’en réalité c’est très simple. Pour cela nous allons utiliser deux fonctions de PHP, var_dump et json_decode, cela va nous permettre de connaître la structure de notre fichier JSON puis de faire le script PHP adapté à celui-ci .
Créons un premier script PHP dans un fichier pour découvrir la structure de notre document JSON et lançons le :
<?php // indiqué le chemin de votre fichier JSON, il peut s'agir d'une URL $json = file_get_contents("cotation_bourse.json"); var_dump(json_decode($json)); ?>
Le résultat qui s’affiche et qui nous présente la structure de notre fichier JSON est le suivant :
Maintenant, il devient très simple de le comprendre, la fonction var_dump présente notre fichier sous la forme d’objets, chaque objet peut lui même contenir un objet ou un tableau par exemple. La capture ci-dessous vous présente la composition de notre fichier. Dans notre exemple ci-dessous, si on souhaite accéder à l’objet 3 dans le rectangle vert il faut passer par l’objet 2 lui-même contenu dans l’objet 1.
L’objet 3 contient la date du jour, pour la récupérer nous allons utiliser le code adéquat maintenant que nous savons qu’elle est contenue dans la variable date de l’objet 3, cette variable est elle-même contenue dans la variable features de l’objet 2 qui est contenu dans la variable response de l’objet 1. On sait quelle variable contient la donnée grâce au petit décalage en dessous. On peut donc utiliser le code suivant pour récupérer la valeur contenue dans la variable date :
<?php $json = file_get_contents("cotation_bourse.json"); $parsed_json = json_decode($json); $date_jour = $parsed_json->{'response'}->{'features'}->{'date'}; ?>
J’ai donc utilisé la fonction json_decode qui permet de récupérer une chaîne encodée en JSON et de la convertir en une variable PHP nommé ici parsed_json, cette variable contient notre fichier JSON d’une manière exploitable, ensuite je créer une seconde variable date_jour avec le chemin d’accès à la variable date dans le fichier JSON, celui-ci étant contenu dans la variable $parsed_json.
Nous avions vu que pour accéder à date dans l’objet 3, il fallait passer par response dans l’objet 1 et features dans l’objet 2. La date du jour est maintenant contenue dans la variable $date_jour. Pour naviguer dans un fichier JSON il s’agit simplement d’indiquer le bon chemin après avoir analysé la structure.
Voyons maintenant les tableaux dans les objets, sur la capture présentant le résultat de var_dump vous pouvez constater qu’un tableau (array) est présent dans l’objet « cotation_bourse ». En réalité, ils sont deux tableaux, représenté par 0 => et 1=>, 0 est égal au tableau n°1 et 1 au tableau n°2. Comme vous le voyez, chaque tableau contient lui-même des objets qui eux-mêmes auraient pu contenir d’autres objets, ce n’est pas le cas ici par souci de simplicité. L’image ci-dessous vous présente la structure
Pour la petite explication, les objets « response » et « cotation_bourse » sont des objets de bases tous les deux, autrement dit les deux sont les premiers objets en contenant d’autres. On le remarque, car ils sont sur la même ligne verticale. Pour accéder à nos tableaux, nous allons reprendre notre code précédent et lui apporter de légères modifications.
<?php
$json = file_get_contents(« cotation_bourse.json »);
$parsed_json = json_decode($json);
$date_jour = $parsed_json->{‘response’}->{‘features’}->{‘date’};
$heure_cac40 = $parsed_json->{‘cotation_bourse’}[0]->{‘bourse’}->{‘heure’};
$minute_cac40 = $parsed_json->{‘cotation_bourse’}[0]->{‘bourse’}->{‘minute’};
$nom_compagnie = $parsed_json->{‘cotation_bourse’}[0]->{‘total’}->{‘compagnie’};
$cotation_total = $parsed_json->{‘cotation_bourse’}[0]->{‘total’}->{‘cotation’};
$tendance_total = $parsed_json->{‘cotation_bourse’}[0]->{‘total’}->{‘tendance’};
?>
Comme vous le constatez le il suffit d’indiquer le numéro du tableau entre crochet derrière l’objet qui contient le tableau, donc cotation_bourse, pour pouvoir y accéder, ici le tableau [0] correspond au premier tableau, je récupère ainsi les informations contenues dans celui-ci de la même manière que pour le premier exemple, en passant d’objets en objet.
Nous pouvons ainsi récupérer les variables et afficher une phrase qui apparaîtra dans le navigateur par exemple avec le code complet :
<?php $json = file_get_contents("cotation_bourse.json"); var_dump(json_decode($json)); $parsed_json = json_decode($json); $date_jour = $parsed_json->{'response'}->{'features'}->{'date'}; $heure_cac40 = $parsed_json->{'cotation_bourse'}[0]->{'bourse'}->{'heure'}; $minute_cac40 = $parsed_json->{'cotation_bourse'}[0]->{'bourse'}->{'minute'}; $nom_compagnie = $parsed_json->{'cotation_bourse'}[0]->{'total'}->{'compagnie'}; $cotation_total = $parsed_json->{'cotation_bourse'}[0]->{'total'}->{'cotation'}; $tendance_total = $parsed_json->{'cotation_bourse'}[0]->{'total'}->{'tendance'}; echo "Le ${date_jour} à ${heure_cac40} h ${minute_cac40}, la cotation de ${nom_compagnie} est de ${cotation_total} et sa tendance de ${tendance_total} %n"; ?>
Le résultat sera le suivant :
Ou sinon, on regarde le 2ème paramètre de json_decode et on se simplifie la vie en ne manipulant qu’un tableau 🙂
Perso, je préfère cette méthode mais après ce sont les goûts et les couleurs 😉
Bonjour, et merci pour ce tuto 🙂
J’ai un petit soucis cependant :s ça marche très bien tant que mon fichier json n’est pas une url, mais à partir du moment où j’essaie avec une url, ça ne fonctionne plus.
Pourrais-tu stp faire un ajout à ton tuto avec les étapes à réaliser si on souhaite que le fichier json soit récupérer via une url stp ?
Je t’en remercie par avance 🙂
Et les erreurs renvoyées (sachant que l’url fonctionne très bien lorsque je la colle dans mon navigateur):
-Warning: file_get_contents(): Unable to find the wrapper "https" – did you forget to enable it when you configured PHP?
-Warning: file_get_contents(https://www.dropbox.com/xxxxxxxxx.json): failed to open stream: Invalid argument
Je crois que le problème viens du fait que l’URL est en HTTPS donc cryptée, car sinon ton code $json = file_get_contents(‘https://www.dropbox.com/xxxxxxxxxxx.json’);
var_dump(json_decode($json)); est correct
Merci de ta réponse 🙂
J’ai donc essayé de positionner ceci avant ton code:
[code]// Création d’un gestionnaire curl
Mais cela me retourne cette erreur ci:
Fatal error: Call to undefined function curl_init()
alors que j’ai bien dans mes extension le fichier php.curl.dll
Aurais-tu une explication pouvant m’aider stp ?
Encore merci.
Quelle forme de serveur web as-tu, WAMP, LAMP… ??? As-tu activé l’extension ?
J’utilise WAMP et je n’avais en effet pas activé l’extension (‘-_-)
J’ai à présent cette erreur ci:
( ! ) Fatal error: Call to undefined function curl_unescape()
Ce qui me semble bizarre vu que l’extension étant activé, je ne devrai pas avoir de fonction inconnue si ?
Merci de tes réponses en tous cas 🙂
C’est étrange, ce message arrive souvent lorsque CURL n’est pas installé, je serais toi je demanderais de l’aide sur les forums de developpez.com, tu auras beaucoup plus de réponse et rapidement, j’espère que tu pourras rapidement résoudre ton souci 😉
Salut,
merci pour ces explications super utiles.
J’ai une question cependant : comment traiter les infos lorsque l’on a une sorte de boucle d’informations ?
Exemple :
[
{
« response »: {
« version »: « 0.9 »
, »termsofService »: « http://www.actualitix.com »
, »features »: {
« date »: « 24/09/2013 »
}
},
{
« response »: {
« version »: « 0.9 »
, »termsofService »: « http://www.actualitix.com »
, »features »: {
« date »: « 24/09/2013 »
}
},
]
Merci 😉
J’ai rien dit… il suffit de faire un foreach… ^^
Parfait 😉
bonjour,
je suis débutant en php..
Je me sers de ton code pour comprendre le foreach sous Json.
est ce que tu pourrais me montrer comment faire le le foreach pour récupérer les infos des autres tables comme l’exemple:
Le 24/09/2013 à 15 h 04, la cotation de Total est de 43,15 et sa tendance de + 1,04 %
Si tu peux m’aider
J’ai rien dit… il suffit de faire un foreach…
Bonjour, dans votre exemple vous parlez d’un tableau
{‘response’}->{‘features’}->{‘date’};
$heure_cac40 = $parsed_json->{‘cotation_bourse’}[0]->{‘bourse’}->{‘heure’};
$minute_cac40 = $parsed_json->{‘cotation_bourse’}[0]->{‘bourse’}->{‘minute’};
$nom_compagnie = $parsed_json->{‘cotation_bourse’}[0]->{‘total’}->{‘compagnie’};
$cotation_total = $parsed_json->{‘cotation_bourse’}[0]->{‘total’}->{‘cotation’};
$tendance_total = $parsed_json->{‘cotation_bourse’}[0]->{‘total’}->{‘tendance’};
echo « Le ${date_jour} à ${heure_cac40} h ${minute_cac40}, la cotation de ${nom_compagnie}
est de ${cotation_total} et sa tendance de ${tendance_total} %n »;
?>
la question est comment faire pour voir les autres? [0][1][2] etc…..
Beaucoup trop court, encore merci pour ce regale passe sur votre page.
Merci 😉
Bonjour, comment faire pour modifier les données Json avec du PHP (par exemple faire des updates, des Inserts, etc…)
Bonjour,
dans votre exemple, vous mettez en dur dans le code PHP les noms ‘réponse’, ‘features’ et ‘date’
si on souhaitait faire une boucle pour tout lire, sans connaitre ces noms à l’avance, comment faire pour y accéder et les coller dans une variable à utiliser après dans la requête ?:
$monchampreponse = … {$monnomdechamp}->{‘features’}->{‘date’};
bonjour, tout d’abord merci pour votre tuto en fait je sais pas si mon compte a ete trouver parmi vos tuto ou pas mais bon mon probleme est que mon service web permet d’effectuer une inscription en verifiant si l’email et le numero de telephone est correct avec un REGEX mon probleme est que je veut recuperer ce service avec un format JSON
Bonjour,
Comment compter les noeuds en Json ?
Bonjour Numelion,
J’ai ce fichier json :
object(stdClass)#8666 (2) { [« type »]=> string(17) « FeatureCollection » [« features »]=> array(1) { [0]=> object(stdClass)#8663 (3) { [« type »]=> string(7) « Feature » [« properties »]=> object(stdClass)#8662 (9) { [« postcode »]=> array(1) { [0]=> string(5) « 38660 » } [« citycode »]=> array(2) { [0]=> string(5) « 38395 » [1]=> string(2) « 38 » } [« city »]=> array(1) { [0]=> string(26) « plateau-des-petites-roches » } [« toponym »]=> string(26) « Plateau-des-Petites-Roches » [« extrafields »]=> object(stdClass)#8661 (4) { [« population »]=> int(2380) [« status »]=> string(0) « » [« cleabs »]=> string(24) « COMMUNE_0000002200276548 » [« names »]=> array(1) { [0]=> string(26) « plateau-des-petites-roches » } } [« category »]=> array(2) { [0]=> string(13) « administratif » [1]=> string(7) « commune » } [« _score »]=> int(1) [« distance »]=> int(0) [« _type »]=> string(3) « poi » } [« geometry »]=> object(stdClass)#8660 (2) { [« type »]=> string(5) « Point » [« coordinates »]=> array(2) { [0]=> float(5.893712562) [1]=> float(45.333663943) } } } } }
je voudrais extraire la valeur de la donnée « city »
J’ai essayé d’appliquer votre code mais je n’arrive pas à comprendre la structure du fichier.
Une piste ?
Merci
Jacques de Grenoble