JSON vs YAML : Quand utiliser chaque format ?
· Cosyslabs
JSON est le bon choix pour les API, l'échange de données et la configuration générée par des machines. YAML est préférable pour les fichiers de configuration rédigés par des humains où les commentaires, la lisibilité et la ponctuation minimale sont importants. YAML est un surensemble de JSON — tout document JSON valide est du YAML valide, mais YAML comporte des pièges significatifs que vous devez connaître avant de l'adopter.
Comparaison de syntaxe
// JSON
{
"serveur": {
"hôte": "localhost",
"port": 8080,
"tls": true
},
"baseDeDonnées": {
"url": "postgres://localhost/mabd",
"pool": {
"min": 2,
"max": 10
}
},
"fonctionnalités": ["auth", "api", "admin"]
}
# YAML — mêmes données, plus lisibles
serveur:
hôte: localhost
port: 8080
tls: true
baseDeDonnées:
url: postgres://localhost/mabd
pool:
min: 2
max: 10
fonctionnalités:
- auth
- api
- admin
YAML supprime les guillemets, les accolades, les crochets et les virgules. Il utilise l'indentation (espaces uniquement — pas de tabulations) pour exprimer la structure.
YAML est un surensemble de JSON
Vous pouvez intégrer du JSON directement dans un fichier YAML et c'est valide :
# Ceci est du YAML valide
nom: Alice
config: {"debug": true, "niveau": 3}
Cela signifie que les parseurs YAML peuvent analyser du JSON, et que les convertisseurs YAML-vers-JSON sont sans perte (sauf pour les fonctionnalités spécifiques à YAML comme les ancres et les commentaires, que JSON ne peut pas représenter).
Où JSON gagne
Réponses d'API
JSON est la lingua franca des API REST. Chaque client HTTP, de curl au fetch du navigateur, gère nativement JSON :
const réponse = await fetch("/api/utilisateurs");
const données = await réponse.json(); // Analyse JSON intégrée
YAML n'a pas de support natif dans le navigateur et ajoute une dépendance de parseur (~15 Ko pour js-yaml).
Gestion stricte des types
JSON a des types explicites : chaîne, nombre, booléen, null, tableau, objet. YAML infère les types à partir des valeurs, ce qui cause des bogues notoires.
Données générées par machines
Les programmes générant de la configuration ou des données doivent émettre du JSON. JSON est non ambigu, largement supporté et ne dépend pas des espaces.
Écosystème JavaScript
package.json, tsconfig.json, eslintrc.json — les outils JavaScript se sont standardisés sur JSON. Les éditeurs fournissent la validation JSON Schema avec autocomplétion et détection d'erreurs.
Où YAML gagne
Configuration rédigée par des humains
# YAML permet les commentaires — JSON ne le permet pas
# Ce commentaire explique pourquoi le timeout est élevé
serveur:
timeout: 30000 # millisecondes — les clients legacy ont besoin de plus de temps
# Les chaînes multilignes sont lisibles en YAML
message: |
Bienvenue dans le système.
Votre compte a été créé.
Veuillez vérifier votre e-mail pour valider.
Kubernetes, GitHub Actions, Docker Compose
L'écosystème cloud-native s'est standardisé sur YAML pour les manifestes et les pipelines :
# Workflow GitHub Actions
name: CI
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: npm test
Chaînes multilignes
YAML gère élégamment les chaînes multilignes avec des scalaires de bloc :
# Scalaire de bloc littéral — préserve les sauts de ligne
description: |
Ligne un.
Ligne deux.
Ligne trois.
# Scalaire de bloc plié — les sauts de ligne deviennent des espaces
résumé: >
Ce long texte sera
plié en une seule ligne
lors de l'analyse.
JSON nécessite des \n échappés :
{
"description": "Ligne un.\nLigne deux.\nLigne trois."
}
Pièges de YAML (Le problème de la Norvège et autres)
L'inférence de types de YAML a causé de vrais incidents en production.
Le problème de la Norvège
pays:
- GB
- DE
- NO # YAML 1.1 analyse ceci comme booléen false !
- SE
Dans YAML 1.1 (utilisé par de nombreux anciens parseurs), no, NO, No sont analysés comme false. De même, yes, YES, Yes deviennent true. YAML 1.2 (2009) supprime ce comportement, mais de nombreux parseurs implémentent encore 1.1.
Correction : Mettre entre guillemets les valeurs qui pourraient être mal interprétées :
pays:
- "GB"
- "DE"
- "NO" # Maintenant en toute sécurité une chaîne
- "SE"
Analyse des nombres octaux
permissions_fichier: 0777 # YAML 1.1 : analysé comme octal 511, pas décimal 777 !
port: 0755 # octal 493
En YAML 1.2, les zéros initiaux n'impliquent pas l'octal. En 1.1, si. Mettez entre guillemets les valeurs numériques où la précision est importante.
Erreurs d'indentation
YAML n'utilise que des espaces — mélanger tabulations et espaces provoque des erreurs de parseur :
serveur:
hôte: localhost
port: 8080 # TABULATION ici — erreur d'analyse YAML !
Clés en double
config:
debug: true
debug: false # Lequel gagne ? Comportement indéfini
Conversion
// YAML vers JSON (Node.js)
import yaml from "js-yaml";
import fs from "fs";
const contenuYaml = fs.readFileSync("config.yaml", "utf8");
const analysé = yaml.load(contenuYaml);
const json = JSON.stringify(analysé, null, 2);
import yaml, json
with open("config.yaml") as f:
données = yaml.safe_load(f) # Utilisez safe_load, pas load !
print(json.dumps(données, indent=2))
Utilisez toujours yaml.safe_load() en Python, jamais yaml.load(). La version non sécurisée peut exécuter du code Python arbitraire via la désérialisation YAML — un vecteur RCE connu.
Guide de décision
| Situation | Choisir |
|---|---|
| Réponses d'API REST | JSON |
| gRPC / Protocol Buffers | Aucun (binaire) |
package.json, tsconfig.json | JSON |
| Manifestes Kubernetes | YAML |
| GitHub Actions / CI | YAML |
| Docker Compose | YAML |
| Playbooks Ansible | YAML |
| Config où les commentaires sont nécessaires | YAML |
| Config générée par machines | JSON |
| Config rédigée par humains | YAML |
| Données avec beaucoup de chaînes | YAML (pas de guillemets nécessaires) |
Essayez maintenant
Convertissez instantanément entre JSON et YAML avec l'Outil Formateur JSON et l'Outil Formateur YAML — les deux fonctionnent entièrement dans votre navigateur.
Plus d'outils de Cosyslabs
- PDF Convert All — Convertissez, fusionnez et compressez des PDFs. De nombreux pipelines de génération de documents consomment de la configuration JSON ou YAML.
- Unit Convert All — Convertissez des valeurs de mesure souvent trouvées dans les fichiers de configuration (ex: timeouts en ms, tailles de fichiers en Mo).
- Rough Estimator — Estimez l'effort de migration de systèmes de configuration basés sur JSON vers YAML (ou vice-versa).
- Cosyslabs — Le studio derrière Dev Tools !, Routine Toolkit, et plus.