Aller au contenu principal

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"]
}
info

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
astuce

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);
attention

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);
info

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


Que signifie l'acronyme JSON ?


Quelle fonction PHP convertit une donnée PHP (tableau, objet) en chaîne JSON ?


Quelle fonction PHP convertit une chaîne JSON en donnée PHP ?


Quel second paramètre de json_decode() permet d'obtenir un tableau associatif plutôt qu'un objet ?


Quelle fonction permet de lire le contenu d'un fichier sous forme de chaîne de caractères ?


Quelle fonction permet d'écrire une chaîne de caractères dans un fichier ?


Quelle constante utiliser avec json_encode() pour obtenir un JSON indenté et lisible ?


Que renvoie json_decode() sans son second paramètre lorsqu'on lui donne un objet JSON ?


Que renvoie json_decode() si la chaîne fournie n'est pas un JSON valide ?


Pourquoi le format JSON est-il autant utilisé pour les API web ?


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.json avec 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


Bonne pratique - Vérifier qu'un fichier existe avant de le lire

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


Bonne pratique - Toujours vérifier le résultat de json_decode()

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


Bonne pratique - Garder la même structure pour chaque élément

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


Bonne pratique - Toujours utiliser JSON_PRETTY_PRINT pour un fichier destiné à être relu par un humain

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.

📌 Une solution