Skip to content
Back to Blog
how-to-convert

Comment convertir du YAML en JSON : les pièges courants à éviter

2026-05-17 8 min read

Pourquoi YAML et JSON ne sont pas aussi interchangeables qu'ils en ont l'air

YAML et JSON se ressemblent, et leur relation est étroite. YAML 1.2 est même un sur-ensemble de JSON, donc tout JSON valide est aussi du YAML valide. Ça a l'air génial, non ? Ça l'est, jusqu'à ce que tu convertisses un fichier YAML du monde réel et que tu découvres ta première corruption de données silencieuse. Les deux formats ont simplement des objectifs de conception différents. JSON a été conçu pour les machines : strict, sans ambiguïté et sans place pour les commentaires. YAML, en revanche, a été conçu pour les humains. Il utilise l'indentation pour la structure, prend en charge les chaînes de caractères sur plusieurs lignes, autorise les commentaires et dispose d'un système d'inférence de type qui essaie de deviner ton intention. C'est précisément cette tentative d'aide qui fait dérailler les conversions. Un analyseur YAML pourrait lire la chaîne 'yes' et l'interpréter comme le booléen `true`. Il pourrait voir '1.0' et produire un nombre à virgule flottante, pas la chaîne que tu as tapée. Ce ne sont pas des bugs ; la spécification YAML fonctionne comme prévu. Le problème survient parce que JSON n'a pas une telle ambiguïté. Une fois que ta valeur YAML devient un booléen dans les données analysées, la sortie JSON écrira `true`, et la chaîne d'origine sera perdue à jamais. Lorsque tu convertis des fichiers de configuration pour un cluster Kubernetes, une spécification OpenAPI ou un pipeline CI/CD, ces changements de type silencieux peuvent tout casser en aval sans un seul message d'erreur. Pour convertir des fichiers de manière fiable, tu dois comprendre ces différences fondamentales.

La façon la plus rapide de convertir : utiliser CocoConvert

Quand tu as juste besoin de convertir un fichier, le plus rapide est d'utiliser un outil dédié plutôt que de bricoler un script. Le [convertisseur YAML vers JSON](/convert/yaml-to-json) de CocoConvert gère toute l'analyse et la sérialisation, te donnant immédiatement une sortie correctement formatée et encodée en UTF-8. Le processus est ultra-simple : colle ton YAML, télécharge un fichier .yaml ou .yml, et clique sur Convertir. Ton JSON apparaît dans le panneau de sortie, prêt à être copié ou téléchargé. CocoConvert utilise les règles d'analyse modernes de YAML 1.2, donc tu ne te feras pas avoir par le vieux « Problème norvégien » où la chaîne 'NO' était mal interprétée comme le booléen `false`. Si ton YAML source a une erreur d'indentation, tu obtiendras une erreur d'analyse claire avec un numéro de ligne au lieu d'une sortie corrompue en silence. Il gère aussi correctement les fichiers YAML multi-documents (ceux avec des séparateurs `---`). Ils sont convertis en un tableau JSON, où chaque document devient un élément du tableau. C'est le comportement standard et attendu, mais c'est bon à savoir si tu vois un tableau inattendu dans ta sortie parce que ton fichier commençait par `---`. Il y a une limitation : l'outil ne prend pas en charge les ancres et alias YAML qui font référence à des nœuds à travers différents documents dans le même fichier. Pour ces cas complexes impliquant des ancres inter-documents, tu devras les résoudre d'abord, soit à la main, soit avec un script local, avant de télécharger le fichier pour la conversion.

Coercition de type YAML : les pièges qui font le plus mal

La coercition de type est la cause numéro un de perte de données lors de la conversion de YAML en JSON. Avant de convertir un fichier de production, tu dois absolument vérifier ces pièges spécifiques. **Booléens à partir de chaînes inattendues.** Les anciens analyseurs YAML 1.1 (comme PyYAML avant la version 6.0) interprétaient `yes`, `no`, `on` et `off` comme des booléens. Le YAML 1.2 moderne ne traite que `true` et `false` de cette manière, mais si ton fichier source a été créé par un outil plus ancien, il pourrait contenir 'yes' alors qu'il signifie vraiment la chaîne 'yes'. Si tu ne connais pas l'origine du fichier, tu dois vérifier ces valeurs manuellement. **Entiers octaux.** Celui-ci est un classique. En YAML, une valeur comme `0755` est analysée comme l'entier octal 493. C'est un piège notoire dans les manifestes Kubernetes pour définir les permissions de fichiers. Une fois converti, ton JSON contiendra le nombre `493`, pas la chaîne `'0755'`. Si un processus en aval essaie d'utiliser ce nombre dans un appel `chmod`, les permissions seront complètement fausses, et tu n'auras aucune erreur. **Cas limites des nombres à virgule flottante.** YAML comprend des valeurs flottantes spéciales comme `.inf`, `-.inf` et `.nan`. JSON, non. CocoConvert gère cela en les convertissant en chaînes de caractères 'Infinity', '-Infinity' et 'NaN'. C'est une solution de repli sensée, mais si ton application s'attend uniquement à des nombres, elle pourrait échouer sur ces valeurs de chaîne, nécessitant un post-traitement. **Représentations de la valeur nulle.** YAML est flexible avec les valeurs nulles, acceptant `null`, `~`, ou même simplement une valeur vide après une clé. Tout cela deviendra un `null` standard en JSON. C'est généralement sans conséquence, mais souviens-toi qu'une clé sans rien après les deux-points devient un `null` JSON, pas une chaîne vide `""`.

Gérer les chaînes multilignes et les commentaires

YAML offre deux syntaxes puissantes pour les chaînes multilignes qui n'ont pas d'équivalent direct en JSON : les scalaires de bloc littéral (`|`) et les scalaires de bloc plié (`>`). Un bloc littéral (`|`) préserve chaque retour à la ligne. Un bloc plié (`>`) transforme les retours à la ligne simples en espaces mais conserve les doubles retours à la ligne. Les deux syntaxes produisent une seule chaîne JSON, mais les différences subtiles dans la gestion des retours à la ligne sont cruciales pour le contenu intégré comme les scripts shell, les requêtes SQL ou les certificats. Par exemple, ce YAML : ```yaml script: | echo hello echo world ``` devient ce JSON : ```json {"script": "echo hello\necho world\n"} ``` Remarque que le retour à la ligne final (`\n`) est préservé par défaut avec le style littéral `|`. Pour le supprimer, tu utiliserais l'indicateur de rognage `|-`. Quiconque a déjà débogué un script CI qui échoue à cause d'une différence subtile d'espace blanc connaît cette galère. Se tromper ici peut casser des scripts ou des API sensibles aux espaces. Les commentaires sont un problème bien plus difficile. YAML supporte les commentaires avec `#`. JSON, non. Point final. Cela signifie que pendant la conversion, chaque commentaire de ton fichier YAML est définitivement supprimé. Tout le contexte crucial expliquant *pourquoi* une certaine valeur est définie — une pratique courante dans l'infrastructure-as-code — disparaît de la sortie JSON. Il n'y a pas de solution de contournement dans la spécification JSON. Ma recommandation est simple : considère toujours ton YAML commenté comme la source de vérité et le JSON généré comme un artefact de construction jetable. Certaines équipes utilisent JSONC (JSON avec commentaires), mais cela ne fait que repousser le problème de compatibilité.

Ancres, alias et clés de fusion

Les ancres et alias de YAML sont une fonctionnalité fantastique pour garder tes fichiers DRY (Don't Repeat Yourself), mais ils introduisent de la complexité lors de la conversion en JSON. Tu définis une ancre avec `&nom-ancre` puis tu la référence avec `*nom-ancre`. Un analyseur YAML développe ces alias en lisant le fichier, construisant la structure de données finale en mémoire. La sortie JSON, par conséquent, contient le contenu entièrement développé et dupliqué, sans aucune trace des ancres d'origine. Considère ce modèle courant : ```yaml defaults: &defaults timeout: 30 retries: 3 production: <<: *defaults host: prod.example.com staging: <<: *defaults host: staging.example.com ``` La syntaxe `<<` est une clé de fusion YAML. Le JSON résultant sera : ```json { "defaults": {"timeout": 30, "retries": 3}, "production": {"timeout": 30, "retries": 3, "host": "prod.example.com"}, "staging": {"timeout": 30, "retries": 3, "host": "staging.example.com"} } ``` L'expansion est correcte, mais la concision du YAML original a disparu. Si 50 services héritaient de cette ancre de valeurs par défaut, le JSON contiendrait 50 copies de ces données. Pour une machine, c'est parfaitement acceptable. Pour un humain essayant de lire le fichier, ou pour les systèmes où la taille du fichier est une préoccupation, c'est un inconvénient majeur. Sache que le support des clés de fusion (`<<`) est techniquement une extension de YAML, pas une partie de la spécification de base, donc certains analyseurs stricts le rejetteront. CocoConvert gère les clés de fusion sans problème. Si tu scriptes une conversion avec PyYAML de Python, tu dois utiliser `yaml.full_load()` ou `yaml.safe_load()`. Évite l'ancien `yaml.load()` sans argument `Loader`, car il est obsolète depuis PyYAML 5.1 en raison de risques de sécurité majeurs.

Convertir du YAML en JSON par programmation

Pour les conversions en masse, les intégrations dans des pipelines de construction, ou tout type de traitement automatisé, tu auras besoin d'une solution en ligne de commande ou scriptée. Un outil web est génial pour les conversions ponctuelles, mais l'automatisation exige du code. Voici les moyens les plus fiables de le faire. **Python (l'option la plus portable) :** ```python import yaml, json, sys with open(sys.argv[1], 'r') as f: data = yaml.safe_load(f) print(json.dumps(data, indent=2, ensure_ascii=False)) ``` Utilise toujours `yaml.safe_load()`. L'ancien `yaml.load()` est un cauchemar de sécurité qui peut exécuter du code arbitraire à partir d'un fichier YAML malveillant. L'argument `ensure_ascii=False` est aussi une bonne habitude, car il préserve les caractères Unicode au lieu de les échapper. **Node.js :** ```javascript const yaml = require('js-yaml'); const fs = require('fs'); const data = yaml.load(fs.readFileSync(process.argv[2], 'utf8')); console.log(JSON.stringify(data, null, 2)); ``` La bibliothèque `js-yaml` utilise les règles modernes de YAML 1.2 par défaut (depuis la v4.0). Si tu travailles sur un projet plus ancien, vérifie bien ton `package.json`. Les versions antérieures à 4.0 utilisent les règles de YAML 1.1 et vont incorrectement convertir des chaînes comme 'yes' et 'no' en booléens. **yq (outil en ligne de commande) :** ```bash yq -o=json eval '.' input.yaml > output.json ``` Franchement, `yq` est le meilleur outil pour ce travail en ligne de commande. C'est un processeur YAML spécialement conçu qui gère tout correctement — fichiers multi-documents, ancres, clés de fusion — avec une simple option pour la sortie JSON. Installe-le avec Homebrew sur macOS (`brew install yq`) ou récupère le binaire sur GitHub pour Linux/Windows. Bien sûr, pour une conversion rapide sans rien installer, l'[outil YAML vers JSON de CocoConvert](/convert/yaml-to-json) reste le moyen le plus rapide de s'en acquitter.

Valider ton résultat avant de l'utiliser

Convertir un fichier sans le valider est la recette parfaite pour introduire des bugs subtils en production. Un fichier JSON peut être syntaxiquement valide mais contenir des données sémantiquement fausses, comme les coercitions de type dont nous avons parlé. Voici une checklist pratique pour t'éviter de futurs maux de tête. **Validation de la syntaxe.** Au minimum, passe la sortie dans un linter JSON. Ton éditeur de code (comme VS Code ou un IDE JetBrains) le fait probablement automatiquement. Depuis la ligne de commande, l'outil intégré de Python `json.tool` est un cheval de bataille fiable : `python3 -m json.tool output.json > /dev/null`. Il se termine avec le code 0 pour un JSON valide et te dit exactement où ça a cassé en cas d'échec. **Validation de schéma.** Pour les fichiers critiques, utilise un schéma. Si ton format cible a un Schéma JSON (courant pour les specs OpenAPI, AWS CloudFormation, et les CRD Kubernetes), valide-le par rapport à celui-ci. Un outil comme `ajv-cli` (`ajv validate -s schema.json -d output.json`) attrapera les incohérences de type qu'une simple vérification de syntaxe ne peut pas voir. **Comparer avec une version de référence.** Quand tu as un fichier JSON de référence, faire une comparaison (diff) est essentiel. Mais d'abord, normalise l'ordre des clés pour éviter les différences bruyantes et sans signification. L'outil `jq` peut trier les clés de manière déterministe : `jq --sort-keys . output.json > normalized.json`. Rappelle-toi, l'ordre des clés en JSON n'a pas d'importance, mais il te rendra fou quand tu essaieras de comparer des fichiers. **Vérification ponctuelle des types convertis.** Si tu soupçonnes que ton YAML contenait des valeurs comme '1.0' ou '0755', vérifie directement la sortie JSON. Un rapide `grep -n "0755" output.json` te dira instantanément si ta chaîne octale a survécu à la conversion ou a été transformée en un entier inutile. Sérieusement, prendre cinq minutes pour valider ta sortie avant un commit ou un déploiement est toujours plus rapide que de déboguer un incident de production causé par un booléen qui était censé être une chaîne.

Ready to convert?

Try it now — fast, secure, and private.

Convert Now →
Comment convertir du YAML en JSON : les pièges courants à éviter | CocoConvert Blog