JSON et YAML : les mêmes données, deux styles
JSON et YAML décrivent les mêmes choses : objets (appelés mappings en YAML), listes, chaînes, nombres, booléens et null. Le JSON utilise accolades, crochets, guillemets et virgules. Le YAML utilise l’indentation et des tirets, ce qui le rend plus court et plus facile à lire et à modifier à la main. C’est pourquoi des outils comme Kubernetes, Docker Compose, GitHub Actions et Ansible utilisent le YAML pour la configuration, alors que les API parlent en général JSON.
On a souvent besoin de passer de l’un à l’autre. Une API renvoie du JSON et vous le voulez dans un fichier de configuration. Ou une configuration YAML doit être envoyée à un programme qui ne lit que le JSON. Ce convertisseur fait les deux.
Mode d’emploi
- Choisissez un sens avec le bouton JSON vers YAML ou YAML vers JSON.
- Collez vos données dans la zone de gauche, appuyez sur Ouvrir un fichier ou sur Exemple. Le résultat apparaît à droite pendant la frappe.
- Choisissez une Indentation de 2 ou 4 espaces. Dans le sens YAML vers JSON, il y a aussi une option Minifié.
- Pour JSON vers YAML, activez Trier les clés de A à Z pour ranger les clés par ordre alphabétique.
- Appuyez sur Copier, ou sur Télécharger pour enregistrer un fichier
.yamlou.json.
Quand vous changez de sens, le résultat actuel passe dans la zone de saisie : vous pouvez convertir dans un sens puis dans l’autre pour vérifier un aller-retour.
Exemple de JSON vers YAML
{"name":"web-app","version":3,"private":true,"ports":[80,443],"database":{"host":"localhost","password":null},"tags":["api","v2"]}
devient :
name: web-app
version: 3
private: true
ports:
- 80
- 443
database:
host: localhost
password: null
tags:
- api
- v2
Des guillemets là où il faut
Certaines chaînes ressemblent à d’autres types pour un analyseur YAML. Le convertisseur les met entre guillemets pour qu’elles restent des chaînes. Ce JSON :
{"zip":"02134","enabled":"yes","version":"1.10","note":"a: b","empty":""}
devient :
zip: "02134"
enabled: "yes"
version: "1.10"
note: "a: b"
empty: ""
Sans les guillemets, 02134 perdrait son zéro de tête, 1.10 deviendrait le nombre 1.1, et un ancien analyseur YAML 1.1 (PyYAML et beaucoup d’outils de CI suivent ces règles) lirait yes comme true. Le convertisseur suit les règles de guillemets les plus strictes, pour que le résultat se lise de la même façon dans les anciens et les nouveaux analyseurs. Les dates comme "2024-01-15" sont mises entre guillemets pour la même raison. Les textes français, comme une valeur "Note : à relire", reçoivent aussi des guillemets dès qu’ils contiennent un deux-points suivi d’une espace.
Exemple de YAML vers JSON
# App settings
name: web-app
ports:
- 80
- 443
debug: false
retries: 3
owner: ~
devient :
{
"name": "web-app",
"ports": [
80,
443
],
"debug": false,
"retries": 3,
"owner": null
}
Le commentaire a disparu, puisque le JSON n’a pas de commentaires, et ~ est le raccourci YAML de null.
Les clés de fusion sont résolues. Ce fichier de style Rails :
defaults: &defaults
adapter: postgres
host: localhost
development:
<<: *defaults
database: dev_db
donne :
{
"defaults": {
"adapter": "postgres",
"host": "localhost"
},
"development": {
"adapter": "postgres",
"host": "localhost",
"database": "dev_db"
}
}
Deux documents séparés par --- (par exemple kind: Service et kind: Deployment) deviennent un seul tableau. Avec l’option Minifié, cela donne [{"kind":"Service"},{"kind":"Deployment"}].
Comment les valeurs sont lues
Le sens YAML vers JSON suit les règles du YAML 1.2. Selon ces règles, yes, no et on sont de simples chaînes, seuls true et false sont des booléens, et les dates restent des chaînes. Cette saisie :
a: yes
b: no
c: on
d: true
e: 010
f: 0o10
g: 1e3
h: 2024-01-15
se convertit (minifiée) en :
{"a":"yes","b":"no","c":"on","d":true,"e":10,"f":8,"g":1000,"h":"2024-01-15"}
Notez que 010 est lu comme dix, et que 0o10 est l’octal de huit. Des valeurs françaises comme oui ou non restent toujours des chaînes, quel que soit l’analyseur.
Si une valeur doit rester du texte, mettez-la entre guillemets dans le YAML.
Conseils pour un aller-retour propre
- Convertir du JSON en YAML puis revenir donne les mêmes données, mais pas toujours le même texte. L’ordre des clés est conservé, sauf si vous activez Trier les clés de A à Z.
- Les commentaires, ancres et balises personnalisées du YAML n’ont pas d’équivalent JSON. Les ancres sont développées en copies complètes des données.
- Les très grands entiers, comme les identifiants à 20 chiffres, restent exacts de JSON vers YAML quand le navigateur le permet. De YAML vers JSON, ils passent par les nombres JavaScript : stockez donc les longs identifiants sous forme de chaînes entre guillemets.
- Vos fichiers restent sur votre appareil. Rien n’est envoyé.
Erreurs
Les erreurs sont signalées avec la ligne et la colonne, et Afficher dans l’entrée vous y amène. Une virgule finale en JSON donne Ligne 3, colonne 1 : Une virgule finale avant « } » n'est pas autorisée. En YAML, une clé répétée donne Map keys must be unique, et les tabulations utilisées pour l’indentation sont refusées, car le YAML n’autorise que les espaces.
Autres façons de convertir
yq. La version Go de yq convertit en ligne de commande : elle accepte le JSON en entrée, puisque le JSON est du YAML valide, et sait écrire l’un ou l’autre format.
Python. Avec le paquet PyYAML, yaml.safe_dump(json.load(f)) écrit du YAML à partir d’un fichier JSON. PyYAML suit le YAML 1.1, vérifiez donc les chaînes comme yes et no.
VS Code. Plusieurs extensions ajoutent des commandes pour convertir une sélection entre JSON et YAML.
Outils associés
Pour ranger un fichier YAML sans le convertir, utilisez le formateur YAML. Pour vérifier ou indenter d’abord le JSON, utilisez le formateur JSON. Pour des données de tableur, commencez par le convertisseur CSV en JSON.