Le format JSON
Notions théoriques
Qu'est-ce que le format JSON ?
JSON signifie JavaScript Object Notation. C'est un format de texte léger, facile à lire, utilisé pour représenter des données structurées : des nombres, des chaînes de caractères, des tableaux, des objets...
Bien que son nom vienne de JavaScript, JSON est aujourd'hui utilisé dans presque tous les langages de programmation, y compris PHP. Vous le retrouverez partout :
- dans les API web, pour échanger des données entre un serveur et une application (site web, application mobile...),
- dans des fichiers de configuration,
- pour sauvegarder des données dans un fichier simple, sans avoir besoin d'une base de données.
Voici à quoi ressemble une donnée au format JSON :
{
"nom": "Alice",
"age": 25,
"estActif": true,
"langages": ["PHP", "JavaScript", "SQL"]
}
On retrouve dans ce format des similitudes avec les tableaux associatifs PHP : des paires clé/valeur, entre accolades { } pour un objet, et entre crochets [ ] pour un tableau de valeurs.
json_encode() : de PHP vers JSON
La fonction json_encode() convertit une donnée PHP (tableau, chaîne, nombre...) en une chaîne de caractères au format JSON.
$user = [
"nom" => "Alice",
"age" => 25,
"estActif" => true,
"langages" => ["PHP", "JavaScript", "SQL"],
];
$json = json_encode($user);
echo $json;
// Affiche : {"nom":"Alice","age":25,"estActif":true,"langages":["PHP","JavaScript","SQL"]}
Pour obtenir un résultat plus lisible, indenté sur plusieurs lignes, on utilise la constante JSON_PRETTY_PRINT :
echo json_encode($user, JSON_PRETTY_PRINT);
json_decode() : de JSON vers PHP
La fonction json_decode() fait l'opération inverse : elle transforme une chaîne JSON en une donnée PHP utilisable.
$json = '{"nom":"Alice","age":25,"estActif":true}';
$user = json_decode($json);
echo $user->nom; // Affiche : Alice
Par défaut, json_decode() renvoie un objet de type stdClass : on accède à ses propriétés avec la flèche ->, comme pour un objet.
Si vous préférez obtenir un tableau associatif, plus proche de ce que vous manipulez habituellement en PHP procédural, il faut passer true en second paramètre :
$json = '{"nom":"Alice","age":25,"estActif":true}';
$user = json_decode($json, true);
echo $user['nom']; // Affiche : Alice
Sauf besoin particulier, préférez json_decode($json, true) pour obtenir un tableau associatif : c'est la forme la plus simple à manipuler avec les notions déjà vues dans ce cours.
Lire et écrire un fichier JSON
En combinant json_decode()/json_encode() avec file_get_contents()/file_put_contents(), on peut facilement lire et écrire des données dans un fichier .json.
// Lecture d'un fichier de configuration
$contenu = file_get_contents('config.json');
$config = json_decode($contenu, true);
echo "Nom de l'application : " . $config['nomApplication'];
// Écriture d'un fichier
$data = ["nom" => "Alice", "age" => 25];
$json = json_encode($data, JSON_PRETTY_PRINT);
file_put_contents('utilisateur.json', $json);
json_decode() renvoie null si la chaîne fournie n'est pas un JSON valide (une virgule en trop, une accolade manquante...). Il est donc prudent de vérifier le résultat avant de l'utiliser.
Exemple pratique
<?php
// Lecture d'un fichier de configuration JSON
$contenu = file_get_contents('config.json');
$config = json_decode($contenu, true);
if ($config === null) {
print("Erreur : le fichier de configuration n'est pas un JSON valide.");
} else {
echo "Nom de l'application : " . $config['nomApplication'] . "\n";
echo "Version : " . $config['version'] . "\n";
}
// Préparation d'une réponse JSON pour une API
$produits = [
["id" => 1, "nom" => "Clavier", "prix" => 29.90],
["id" => 2, "nom" => "Souris", "prix" => 14.90],
];
header('Content-Type: application/json');
echo json_encode($produits, JSON_PRETTY_PRINT);
La ligne header('Content-Type: application/json') indique au navigateur (ou à l'application qui consulte l'API) que la réponse renvoyée est bien au format JSON, et non du texte ou du HTML.
Test de mémorisation/compréhension
TP pour réfléchir et résoudre des problèmes
Vous gérez la liste des produits d'une petite boutique en ligne, stockée dans un fichier produits.json. Vous allez lire ce fichier, y ajouter un nouveau produit, puis l'enregistrer à nouveau.
- Dans votre répertoire "Documents", créez le répertoire
tp_json. - Créez le fichier
produits.jsonavec le contenu suivant :
[
{"id": 1, "nom": "Clavier", "prix": 29.90},
{"id": 2, "nom": "Souris", "prix": 14.90}
]
- Créez le fichier
gestion.php.
Étape 1 — Lire le contenu du fichier produits.json
Dans une application réelle, vérifiez que le fichier existe avec file_exists('produits.json') avant d'appeler file_get_contents(), pour éviter une erreur si le fichier a été déplacé ou supprimé.
Étape 2 — Décoder le JSON en tableau associatif PHP
Avant d'utiliser le résultat de json_decode(), vérifiez qu'il n'est pas null (ce qui indiquerait un fichier JSON mal formé) avec une condition comme if ($produits === null) { ... }.
Étape 3 — Ajouter un nouveau produit au tableau
Lorsque vous ajoutez un élément à un tableau qui représente une liste de données JSON, veillez à toujours utiliser les mêmes clés (id, nom, prix...) que les éléments existants, pour garder une structure cohérente une fois le tableau réencodé en JSON.
Étape 4 — Encoder le tableau en JSON lisible et l'enregistrer dans le fichier
Lorsque le fichier JSON est destiné à être consulté ou modifié manuellement (fichier de configuration, petite base de données de fichiers...), utilisez JSON_PRETTY_PRINT pour le rendre lisible. Pour une réponse d'API destinée uniquement à un programme, ce n'est pas nécessaire et alourdit inutilement la réponse.