Tous trois représentent des données structurées sous forme de texte. JSON est le plus simple et le plus strict, et le format par défaut des API web. YAML est le plus agréable à écrire à la main et accepte les commentaires, d'où son usage dans les fichiers de configuration (Kubernetes, pipelines de CI, Ansible), mais son typage implicite cache des pièges. XML est le plus verbeux, mais il offre attributs, espaces de noms, mélange de texte et de balisage et une validation par schéma éprouvée : il reste le format des documents et des normes durables (fichiers Office, SVG, RSS, SOAP, plans de site).
En un coup d'œil
| Propriété | JSON | YAML | XML |
|---|---|---|---|
| Structure | Objets, tableaux, scalaires | Tables, séquences, scalaires (par indentation) | Arbre d'éléments avec attributs et texte |
| Types intégrés | Chaîne, nombre, true/false, null | Chaînes, entiers, flottants, booléens, null, horodatages (selon le schéma) | Tout est texte sauf indication d'un schéma |
| Commentaires | Non | Oui, # |
Oui, <!-- --> |
| Lisibilité à la main | Bonne | La meilleure | Verbeux |
| Rigueur | Très strict (pas de virgule finale, guillemets doubles uniquement) | Souple ; les espaces sont significatifs | Bonne formation stricte |
| Références et réutilisation | Non | Ancres et alias (&, *) |
Entités, XInclude |
| Espaces de noms | Non | Non | Oui |
| Langages de schéma | JSON Schema | Généralement JSON Schema | XSD, DTD, RELAX NG |
| Usages typiques | API REST, stockage navigateur, journaux, manifestes de paquets | Configuration, pipelines de CI, Kubernetes, Ansible | Documents Office, SVG, RSS/Atom, SOAP, plans de site |
Le même enregistrement dans chaque format :
{
"name": "web-01",
"port": 8080,
"enabled": true,
"tags": ["prod", "eu"]
}
# Server settings
name: web-01
port: 8080
enabled: true
tags:
- prod
- eu
<!-- Server settings -->
<server name="web-01">
<port>8080</port>
<enabled>true</enabled>
<tags>
<tag>prod</tag>
<tag>eu</tag>
</tags>
</server>
Ces fichiers font 84, 78 et 161 octets. Les versions JSON et YAML donnent exactement les mêmes données ; dans la version XML, 8080 et true ne sont que du texte, et l'auteur a dû choisir si name serait un attribut ou un élément enfant.
JSON
JSON a six sortes de valeurs et une seule façon d'écrire chacune : les analyseurs de tous les langages s'accordent donc sur le sens d'un document. Cette prévisibilité explique son succès dans les API. La contrepartie, c'est qu'il ne pardonne rien à l'édition manuelle : une virgule finale ou une chaîne entre apostrophes, et tout le fichier est invalide. Vérifiez vos fichiers avec le validateur JSON.
Choisissez JSON quand des programmes échangent des données : requêtes et réponses d'API, messages, journaux, stockage du navigateur, ou tout fichier écrit surtout par du logiciel.
YAML
YAML remplace les accolades par l'indentation et permet commentaires, chaînes multilignes et ancres pour éviter les répétitions. Il est agréable à écrire mais facile à rendre subtilement faux. Les analyseurs YAML 1.1, encore courants (PyYAML en est un), devinent le type des valeurs sans guillemets :
| Vous écrivez | YAML 1.1 le lit comme |
|---|---|
country: no |
false (le « problème de la Norvège ») |
version: 1.10 |
le nombre 1.1 |
zip: 01234 |
le nombre octal 668 |
time: 12:30 |
le nombre 750 (base 60) |
Mettez entre guillemets les valeurs qui doivent rester des chaînes et validez avec le validateur YAML. Ne chargez jamais de YAML non fiable avec un chargeur capable de construire des objets arbitraires ; utilisez le chargeur sûr de votre bibliothèque.
Choisissez YAML quand des personnes modifient le fichier à la main et que les commentaires aident : configuration d'applications, manifestes de déploiement, workflows de CI.
XML
XML sépare le balisage du texte : il peut donc représenter des documents où prose et structure se mêlent (<p>Click <b>here</b></p>), pas seulement des enregistrements. Les espaces de noms permettent à plusieurs vocabulaires de partager un fichier, et XSD peut imposer types, plages et structure avant d'accepter les données. Il est verbeux, et les analyseurs doivent être configurés avec soin : désactivez les entités externes et le traitement des DTD pour les entrées non fiables afin d'éviter les attaques XXE et « billion laughs ».
Choisissez XML quand une norme ou un partenaire l'exige, quand des documents mêlent texte et balisage, ou quand il vous faut une validation stricte par schéma et des espaces de noms.
Lequel choisir ?
- API web ou données échangées entre programmes : JSON.
- Configuration modifiée et commentée par des personnes : YAML (en mettant entre guillemets les chaînes qui ressemblent à des nombres ou à des booléens).
- Documents, contenu mixte ou norme XML établie : XML.
- Convertir de l'un à l'autre : le convertisseur JSON vers YAML, le convertisseur YAML vers JSON, le convertisseur JSON vers XML et le convertisseur XML vers JSON le font dans le navigateur ; les conversions avec XML demandent de choisir entre attributs et éléments.
Pour les règles de syntaxe de JSON en détail, voyez Comment fonctionne JSON.