Convertir et écrire les données JSON
Objectif : Convertir le contenu lu en objets JavaScript puis écrire un résultat JSON.
Un fichier JSON lu avec Node.js arrive d’abord sous forme de chaîne : vous ne pouvez pas encore accéder à ses commandes comme à des objets JavaScript. Dans cette leçon, vous allez convertir cette chaîne, vérifier les données, puis les réécrire dans le fichier de suivi sans changer leur structure.
Vous avez déjà lu data/commandes.json en UTF-8 avec readFile depuis node:fs/promises. Nous reprenons ce résultat dans src/serveur.js, où le calcul de démonstration de la commande BR-1042 reste en place. Les commandes du fichier comportent les champs reference, statut et montants.
Convertir la chaîne en données JavaScript
JSON.parse transforme une chaîne JSON valide en valeur JavaScript. Dans votre cas, le fichier contient un tableau : après conversion, vous pouvez parcourir ses commandes et accéder à leurs propriétés avec la notation habituelle, par exemple commandes[0].reference. Si le contenu n’est pas du JSON valide, la conversion échoue ; la gestion de cette erreur sera abordée dans une leçon ultérieure.
import { readFile, writeFile } from 'node:fs/promises';
import { calculerTotal } from './calculer-total.js';
const montantsDemonstration = [12, 18.5, 7.25];
const totalDemonstration = calculerTotal(montantsDemonstration);
console.log(`Total de démonstration : ${totalDemonstration} €`);
const cheminCommandes = 'data/commandes.json';
const contenuBrut = await readFile(cheminCommandes, 'utf8');
console.log('Contenu brut du fichier :');
console.log(contenuBrut);
const commandes = JSON.parse(contenuBrut);
console.log(`Commandes converties : ${commandes.length}`);
console.log(`Première référence : ${commandes[0].reference}`);
const contenuJson = JSON.stringify(commandes, null, 2);
await writeFile(cheminCommandes, contenuJson, 'utf8');
console.log('Les commandes ont été réécrites dans data/commandes.json.');Total de démonstration : 37.75 €
Contenu brut du fichier :
[le contenu actuel de data/commandes.json]
Commandes converties : 3
Première référence : [la première référence du fichier]
Les commandes ont été réécrites dans data/commandes.json.Le programme utilise ici un top-level await, possible dans votre projet parce que package.json déclare les modules ES. Exécutez-le depuis la racine du projet avec node src/serveur.js : le chemin relatif data/commandes.json est alors résolu depuis le répertoire courant du terminal. La première référence affichée dépend des données déjà présentes dans votre fichier.
Sérialiser puis écrire le JSON
JSON.stringify effectue l’opération inverse : elle produit une chaîne à partir d’une valeur JavaScript. Les arguments null et 2 demandent une indentation de deux espaces, ce qui rend le fichier plus facile à lire. Sans ces arguments, le JSON reste valide, mais les données sont généralement écrites sans mise en forme.
writeFile écrit la chaîne obtenue dans le chemin indiqué. Dans cet exercice, vous réécrivez le même tableau dans data/commandes.json : les références, statuts et montants restent inchangés, mais le fichier adopte le formatage demandé. L’appel est attendu avec await afin que l’écriture soit terminée avant l’affichage du message de confirmation.
Vérifier le résultat
Après l’exécution, ouvrez data/commandes.json dans votre éditeur : vous devez retrouver trois objets et les mêmes valeurs qu’avant, présentés avec une indentation de deux espaces. Relancez le script pour confirmer que le fichier reste lisible et que le nombre de commandes est toujours trois. L’écriture est réelle : si le chemin est incorrect ou si le processus ne peut pas écrire dans le fichier, Node.js signalera un problème.
À retenir
JSON.parseconvertit une chaîne JSON valide en valeur JavaScript.JSON.stringify(valeur, null, 2)produit une chaîne JSON indentée.writeFileécrit cette chaîne dans le fichier choisi ; utilisezawaitpour attendre la fin de l’opération.- Vérifiez le contenu après l’écriture, surtout lorsque vous remplacez le fichier source.
Dans la prochaine leçon, vous préparerez la lecture et les calculs des commandes pour leur exposition par HTTP.