JSON, TOML, YAML ou CSON : choisir un format de configuration
L’essentiel : Les fichiers de configuration ont besoin de commentaires, de dates et de texte multi-ligne, là où JSON échoue. Comparez JSON, TOML, YAML et CSON, et voyez ce que la conversion perd toujours.

L'essentiel : utilisez JSON pour l'échange machine, et choisissez TOML ou YAML pour la configuration maintenue par des humains selon l'écosystème (YAML pour Kubernetes et la CI, TOML pour les structures plates ou les dates natives) ; retombez sur JSONC seulement si vous n'êtes pas sûr que le lecteur prenne en charge le dialecte.
JSON existe pour les machines qui échangent des données ; un fichier de configuration est écrit par des humains pour des humains. Confondez les deux et vous obtenez un
config.jsonqui ne peut pas contenir un commentaire et que personne n'ose élaguer.
1. Commencez par deux types de fichiers différents
L'échange de données et la configuration ne partagent pas le même objectif, même si la même personne écrit souvent les deux sur la même machine.
| Dimension | Échange de données | Configuration |
|---|---|---|
| Qui l'écrit | Un programme qui sérialise une valeur | Un humain, ou un humain qui édite une sortie générée |
| Qui le lit | Le programme de quelqu'un d'autre | Votre propre programme |
| Ce qui compte | Zéro ambiguïté, taille, vitesse de parsing | Lisibilité, commentaires, diffs relisibles |
| Fréquence de changement | À chaque requête | Occasionnellement, avec revue |
| Coût d'une erreur | Une réponse 500 | Un service qui ne démarre pas |
JSON marque presque parfaitement dans la colonne de gauche : grammaire minimale, un parseur dans chaque langage, et pas de commentaires signifie pas de problème de « commentaire qui a dérivé de la valeur ». Dans la colonne de droite, sa sévérité est pure friction : pas de commentaires, pas de virgules finales, pas de dates, et le texte multi-ligne doit être replié sur une ligne avec \n.
2. Les quatre prétendants et leur syntaxe
- JSON : défini par la RFC 8259 et l'ECMA-404, avec exactement six types de valeurs : objet, tableau, chaîne, nombre, booléen et
null. C'est le standard d'échange de facto et le seul format qui ne demande aucune décision de sélection. - TOML : créé par Tom Preston-Werner, avec la v1.0.0 publiée en janvier 2021. Son objectif déclaré est un format de configuration minimal aux sémantiques évidentes, qui correspond sans ambiguïté à une table de hachage.
Cargo.tomletpyproject.tomll'utilisent par défaut. - YAML : la spécification actuelle est la 1.2.2. L'indentation exprime la hiérarchie, et il prend en charge commentaires, ancres et documents multiples. Les manifestes Kubernetes, GitHub Actions et Ansible en dépendent tous, au prix d'une spécification volumineuse et de divergences d'implémentation.
- CSON : CoffeeScript Object Notation, qui écrit la configuration à l'aide de littéraux d'objet CoffeeScript. Le
config.csond'Atom l'utilisait. Il prend en charge commentaires, clés non citées et virgules finales, mais son écosystème n'a jamais quitté le monde JavaScript.
2.1 Comparaison des capacités
| Capacité | JSON | TOML | YAML | CSON |
|---|---|---|---|---|
| Commentaires | ✗ | ✓ # |
✓ # |
✓ # |
| Virgules finales | ✗ | ✓ (tableaux, tables inline) | ✓ (collections en flux) | ✓ |
| Clés sans guillemets | ✗ | ✓ | ✓ | ✓ |
| Date-heure native | ✗ (chaîne seulement) | ✓ quatre types date-heure | ✓ (auto-parsé en 1.1) | ✗ |
| Chaînes multi-lignes | ✗ (échappements \n) |
✓ """ et ''' |
✓ scalaires de bloc et repliés | ✓ heredoc |
| Plage des entiers | Illimitée dans la spec, double en pratique | 64 bits signés, doit être sans perte | Précision arbitraire plus .inf/.nan |
Suit JavaScript |
| Imbrication | Accolades et crochets | Tables, tableaux de tables, clés à points | Indentation | Indentation |
| Sensible à l'indentation | ✗ | ✗ | ✓ | ✓ |
null |
✓ | ✗ | ✓ | ✓ |
| Couverture outillage | Tous les langages | Langages principaux | Tous les langages, implémentations variables | JavaScript seulement |
Deux cellules méritent une note. TOML n'a pas de null, ce qui est l'échec le plus courant lors d'une conversion depuis JSON. Le comportement « date native » de YAML signifie qu'un parseur 1.1 transforme 2026-10-31 en objet date automatiquement, donc le type dérive entre langages.
3. Les commentaires : la seule faiblesse de JSON
La conclusion d'abord : si un humain maintient le fichier et doit expliquer pourquoi une valeur est ce qu'elle est, n'utilisez pas du JSON standard.
Quatre voies pratiques, classées par degré d'intrusion :
- Passez à JSONC, qui est du JSON standard plus commentaires et virgules finales. Le
settings.jsonet letsconfig.jsonde VS Code l'utilisent. Le coût est que le lecteur doit utiliser un parseur conscient des commentaires commejsonc-parser; un simpleJSON.parseéchoue. Les détails sont dans JSON5 et JSONC : du JSON avec commentaires. - Gardez un document annexe.
config.jsonreste lisible par machine, tandis queconfig.mdexplique ce que signifie chaque champ et pourquoi il porte cette valeur. Les deux vivent dans le même répertoire et changent dans le même commit. - Placez les explications dans le schéma. Les mots-clés
descriptionet$commentde JSON Schema peuvent documenter les champs, mais les schémas sont rarement livrés avec la configuration à l'exécution, donc la personne qui lit la config peut ne jamais les voir. - Passez à TOML ou YAML, en laissant le format fournir lui-même des commentaires que chaque parseur comprend.
{
// Fixed at 8080: the frontend build script reads this port for its proxy
"port": 8080,
// Disable watching to avoid exhausting inodes in CI
"watch": false
}
JSONC reste un dialecte : l'extension reste .json, mais seuls certains outils le comprennent. Quand les données quittent l'équipe ou franchissent une frontière de service, la ligne entre JSONC et JSON standard doit être documentée.
4. Dates et chaînes multi-lignes : le terrain de prédilection de TOML
TOML promeut la date-heure au rang de type de première classe avec quatre variantes : date-heure avec offset, date-heure locale, date locale et heure locale. Les chaînes multi-lignes ont une syntaxe dédiée qui préserve les retours à la ligne :
title = "json-toolkit"
created = 2026-10-31T09:00:00+08:00
description = """
A JSON toolkit for developers.
Every operation runs locally in the browser.
"""
La même information en JSON doit rétrograder la date en chaîne et échapper les retours à la ligne :
{
"title": "json-toolkit",
"created": "2026-10-31T09:00:00+08:00",
"description": "A JSON toolkit for developers.\nEvery operation runs locally in the browser."
}
En JSON, "created" n'est qu'une chaîne qui ressemble par hasard à une date, donc l'information de type doit vivre dans un contrat de champ : les deux côtés doivent convenir que le champ est toujours RFC 3339. TOML donne au parseur un véritable objet date sans accord verbal requis.
YAML peut aussi contenir du texte multi-ligne, mais les deux styles de bloc signifient des choses différentes : | préserve les retours à la ligne tandis que > les replie en espaces. Choisissez le mauvais et une adresse ou une instruction SQL s'effondre sur une seule ligne, une erreur très difficile à attraper en revue.
5. Nombres : la différence la plus négligée
La spécification JSON n'impose aucune limite à la précision numérique, mais la RFC 8259 avertit aussi que l'interopérabilité est plus sûre quand les nombres sont traités comme des doubles IEEE 754. En JavaScript, les entiers au-delà de 2^53 - 1 perdent silencieusement de la précision :
JSON.parse('{"id":9007199254740993}').id
// 9007199254740992: the last digit is gone
TOML exige que les entiers 64 bits signés soient traités sans perte et qu'ils lèvent une erreur au lieu de tronquer silencieusement ; les flottants suivent binary64 et peuvent aussi être inf ou nan. YAML 1.1 porte un fardeau plus ancien : 1:30 est parsé comme 90 (sexagésimal), et les booléens acceptent yes, no, on et off. D'où le fameux « problème de la Norvège », où le code pays NO devient false.
Pour l'argent, ne comptez jamais sur le flottant dans aucun de ces formats : utilisez des unités mineures entières, des chaînes ou un type décimal de base de données. Le formatage et la précision sont traités plus en profondeur dans les frontières de la conversion JSON, YAML et XML.
6. Tables et imbrication : les frontières dures de TOML
TOML exprime l'imbrication avec des tables et des tableaux de tables :
[server]
port = 8080
[[routes]]
path = "/parse"
method = "POST"
[[routes]]
path = "/minify"
method = "POST"
Il a deux frontières dures que vous devez connaître avant de convertir :
- La racine d'un document TOML est une table, donc un document JSON dont le niveau supérieur est un tableau (comme
[1, 2, 3]) n'a aucune représentation TOML légale ; il doit être enveloppé en{"items": [...]}; - TOML n'a pas de
null, donc un champ JSONnulldoit soit être supprimé, soit remplacé par une chaîne vide ou une valeur sentinelle, avec la sémantique poussée vers le consommateur.
YAML est l'inverse : la profondeur d'imbrication est illimitée, et les ancres plus les clés de fusion peuvent réutiliser des fragments :
defaults: &defaults
retries: 3
timeoutMs: 5000
server:
<<: *defaults
port: 8080
Les ancres sont une capacité propre à YAML et une perte garantie lors de la conversion : JSON n'a aucune syntaxe de référence, donc le fichier étendu grossit et rien n'enregistre que les deux sections étaient autrefois la même configuration.
7. Choisir par scénario
| Scénario | Recommandation | Raison |
|---|---|---|
| API publiques, files de messages, caches | JSON | Universalité maximale, zéro coût de négociation |
| Configuration d'application, plate et typée | TOML | Commentaires, dates, entiers sans perte, comportement de parseur stable |
| Kubernetes, CI, Ansible | YAML | L'écosystème est verrouillé ; changer de format signifie changer d'outils |
VS Code, tsconfig.json |
JSONC | Nativement pris en charge, aucun nouveau format à introduire |
| Réutiliser des fragments de configuration | YAML | Les ancres et clés de fusion sont la seule option prête à l'emploi |
| Généré et machine seulement | JSON (minifié) | Aucun commentaire nécessaire, meilleure taille et coût de parsing |
| Projets Atom ou CoffeeScript hérités | CSON, mais prévoyez une migration | L'écosystème est marginal et le coût de migration croît avec le temps |
Une règle empirique : laissez l'écosystème choisir le format de configuration, pas les préférences personnelles. Écrire du Rust signifie Cargo.toml, déployer sur Kubernetes signifie YAML, et construire une extension VS Code signifie JSONC. Ce n'est que dans un nouveau projet sans contrainte d'écosystème que « lequel est plus agréable à écrire » est une vraie question.
8. Frontières de conversion
| Direction | Information toujours perdue | Conseil |
|---|---|---|
| JSON → TOML | null, tableaux au niveau supérieur, clés inexprimables |
Normalisez la structure et supprimez d'abord les champs vides |
| TOML → JSON | Commentaires, types date, inf / nan |
Convertissez les dates en chaînes RFC 3339 |
| YAML → JSON | Commentaires, ancres et clés de fusion, balises, documents multiples | Étendez d'abord les ancres, puis convertissez document par document |
| JSON → YAML | Aucune perte structurelle, mais les chaînes de date peuvent être auto-parsées | Mettez les chaînes de date entre guillemets |
| CSON → JSON | Commentaires, expressions CoffeeScript | Migrez une fois ; ne synchronisez pas dans les deux sens |
Les outils de conversion garantissent les valeurs, jamais les commentaires. Ne concevez donc pas un pipeline bidirectionnel où « JSON est la source et YAML un artefact de build ». Soit vous générez dans un seul sens, soit vous maintenez un seul fichier source.
9. Liste de vérification
- [ ] Documentez quels types de fichiers utilisent quel format, et listez les dialectes autorisés ;
- [ ] Préférez TOML ou YAML pour la configuration maintenue par des humains, et JSON pour l'échange machine ;
- [ ] Stockez les dates en JSON comme chaînes RFC 3339 et marquez le format dans le schéma ;
- [ ] Représentez l'argent et les entiers au-delà de
2^53en chaînes ou unités mineures, jamais en flottants ; - [ ] Validez chaque format en CI avec son propre parseur, jamais avec
JSON.parsepour YAML ; - [ ] Migrez les formats dans un seul sens, et supprimez l'ancien fichier pour que les deux ne puissent pas dériver.
FAQ
Pourquoi la conversion JSON vers TOML échoue-t-elle sur certains champs ?
TOML n'a pas de null, et la racine d'un document TOML est une table, donc un champ JSON null doit être supprimé ou remplacé par une chaîne vide ou une sentinelle, et un tableau au niveau supérieur doit être enveloppé en {"items": [...]}. Les commentaires, types date et inf/nan sont aussi perdus en sens inverse, ce qui explique pourquoi la conversion devrait être à sens unique.
Faut-il garder deux fichiers de configuration dans des formats différents ?
Non. Les outils de conversion garantissent les valeurs mais jamais les commentaires, donc un pipeline où « JSON est la source et YAML un artefact de build » dérivera. Soit vous générez dans un seul sens, soit vous maintenez un seul fichier source et supprimez l'ancien après migration.
Comment ajouter des commentaires à un fichier de configuration JSON ?
Le JSON standard n'a pas de commentaires. Vous pouvez passer à JSONC (le dialecte de VS Code, lu avec jsonc-parser), garder un document annexe qui explique chaque champ, ou passer à TOML ou YAML. Les fichiers envoyés à d'autres systèmes devraient rester du JSON standard, avec les explications dans la documentation ou un schéma.
TOML ou YAML pour la configuration d'application ?
Choisissez TOML quand la structure est plate, majoritairement des paires clé-valeur, et que les dates natives comptent ; sa sémantique est plus prévisible et les différences entre parseurs plus faibles. Choisissez YAML quand il faut une imbrication profonde, des documents multiples, la réutilisation par ancres, ou quand l'écosystème cible est YAML-first, comme Kubernetes ou la CI. Les deux prennent en charge les commentaires, donc le vrai discriminant est la complexité structurelle et le verrouillage de l'écosystème.
Pourquoi NO devient-il false en YAML ?
YAML 1.1 traite yes, no, on, off, y et n comme des booléens, donc le code pays NO de la Norvège est parsé comme false. C'est le « problème de la Norvège ». Évitez-le en utilisant une implémentation qui suit YAML 1.2, ou en mettant entre guillemets chaque chaîne susceptible d'être mal interprétée.
CSON vaut-il encore la peine ?
Pas pour les nouveaux projets. CSON dépend de l'écosystème CoffeeScript, a peu d'outils maintenus, et un support éditeur et CI limité ; après l'arrêt de la maintenance d'Atom, ses cas d'usage se sont encore réduits. Si un projet a déjà de la configuration CSON, planifiez une migration ponctuelle vers JSON, TOML ou YAML plutôt que d'en ajouter.