Quand devrions-nous préférer utiliser YAML par rapport à JSON et inversement, en tenant compte des points suivants?
Je prévoyais d'utiliser l'un de ces deux systèmes dans notre système intégré pour stocker les fichiers de configuration.
Devrais-je utiliser YAML ou JSON pour stocker mes données Perl?
Techniquement, YAML est un sur-ensemble de JSON. Cela signifie qu’en théorie au moins, un analyseur YAML peut comprendre JSON, mais pas nécessairement l’inverse.
Voir les spécifications officielles dans la section "YAML: Relation à JSON" .
En général, il y a certaines choses que j'aime à propos de YAML et qui ne sont pas disponibles en JSON.
En pratique, aucun de ces deux derniers points n’aura d’importance pour ce que vous ou moi-même faisons, mais à long terme, je pense que YAML sera un format de sérialisation des données plus robuste et viable.
À l'heure actuelle, AJAX et d'autres technologies Web ont tendance à utiliser JSON. YAML est actuellement davantage utilisé pour les processus de données hors ligne. Par exemple, il est inclus par défaut dans le package de vision par ordinateur OpenCV basé sur C, contrairement à JSON.
Vous trouverez des bibliothèques C pour JSON et YAML. Les bibliothèques de YAML ont tendance à être plus récentes, mais je n'ai eu aucun problème avec elles par le passé. Voir par exemple Yaml-cpp .
Différences:
{a: &b [*b]}
, qui seront mises en boucle indéfiniment dans certains convertisseurs. Même avec une détection circulaire, une "bombe yaml" est toujours possible (voir xml bomb ).Observations:
Cela répond au titre, pas aux détails, car la plupart ne font que lire le titre à partir d'un résultat de recherche sur google comme moi. J'ai donc pensé qu'il était nécessaire d'expliquer du point de vue d'un développeur Web .
JavaScript domine clairement le Web à une très grande marge et les développeurs JavaScript préfèrent utiliser JSON car le format de données et les API Web les plus répandues, il est donc difficile de contester l'utilisation de YAML sur JSON lors de la programmation Web au sens général du terme, car vous serez probablement surpris. dans un environnement d'équipe. En fait, la majorité des programmeurs Web ne sont même pas au courant que YAML existe, encore moins d'envisager de l'utiliser.
Si vous faites de la programmation Web, JSON est la méthode par défaut, car aucune étape de traduction n’est nécessaire lorsque vous utilisez JavaScript. Vous devez donc proposer un meilleur argument pour utiliser YAML sur JSON dans ce cas.
Cette question a 6 ans, mais étrangement, aucune des réponses ne traite vraiment des quatre points (vitesse, mémoire, expressivité, portabilité).
Évidemment, cela dépend de la mise en œuvre, mais étant donné que JSON est si largement utilisé et facile à mettre en œuvre, il a tendance à recevoir un support natif plus important, et donc plus rapide. Étant donné que YAML fait tout ce que JSON fait, plus un chargement de camion en plus, il est probable que de toutes les implémentations comparables des deux, le JSON sera plus rapide.
Cependant, étant donné qu'un fichier YAML peut être légèrement plus petit que son équivalent JSON (en raison du nombre réduit de caractères "
et ,
), il est possible qu'un analyseur syntaxique YAML hautement optimisé soit plus rapide dans des circonstances exceptionnelles.
Fondamentalement, le même argument s'applique. Il est difficile de voir pourquoi un analyseur YAML serait plus efficace en mémoire qu'un analyseur JSON, s'il représente la même structure de données.
Comme d'autres l'ont noté, les programmeurs Python ont tendance à préférer YAML, les programmeurs JavaScript au JSON. Je vais faire ces observations:
Il est difficile d'imaginer un langage moderne sans une bibliothèque JSON. Il est également difficile d’imaginer un analyseur JSON implémentant moins que la spécification complète. YAML a un support étendu, mais est moins omniprésent que JSON et chaque analyseur implémente un sous-ensemble différent. Par conséquent, les fichiers YAML sont moins interopérables que vous ne le pensez.
JSON est le gagnant pour les performances (le cas échéant) et l'interopérabilité. YAML est préférable pour les fichiers gérés par l'homme. HJSON est un compromis décent bien que la portabilité soit très réduite. JSON5 est un compromis plus raisonnable, avec une syntaxe bien définie.
Je trouve que YAML est plus facile pour les yeux: moins de parenthèses, "" etc. Bien qu'il y ait le désagrément des onglets dans YAML ... mais on comprend vite.
En termes de performance/ressources, je ne m'attendrais pas à de grandes différences entre les deux.
De plus, nous parlons de fichiers de configuration et je ne m'attendrais donc pas à une fréquence élevée d'activité de codage/décodage, non?
Si vous n'avez besoin d'aucune fonctionnalité que YAML possède et que JSON n'a pas, je préférerais JSON parce que c'est très simple et qu'il est largement pris en charge (possède de nombreuses bibliothèques dans de nombreuses langues). YAML est plus complexe et moins supporté. Je ne pense pas que la vitesse d'analyse ou l'utilisation de la mémoire sera très différente, et peut-être pas une grande partie de la performance de votre programme.
Les autres réponses sont bonnes. Lisez-les d'abord. Mais je vais ajouter une autre raison d'utiliser parfois YAML: git .
De plus en plus, de nombreux projets de programmation utilisent des référentiels git pour la distribution et l'archivage. Et, bien que l'historique d'un référentiel git puisse également stocker des fichiers JSON et YAML, la méthode "diff" utilisée pour suivre et afficher les modifications apportées à un fichier est orientée ligne. Étant donné que YAML est forcé d’être orienté ligne, toute modification mineure d’un fichier YAML est plus facile à voir par un humain.
Il est vrai, bien sûr, que les fichiers JSON peuvent être "rendus jolis" en triant les chaînes/clés et en ajoutant une indentation. Mais ce n'est pas la valeur par défaut et je suis paresseux.
Personnellement, j'utilise généralement JSON pour l'interaction système à système. J'utilise souvent YAML pour les fichiers de configuration, les fichiers statiques et les fichiers suivis. (J'évite aussi généralement d'ajouter des ancres relationnelles YAML. La vie est trop courte pour traquer les boucles.)
De plus, si la vitesse et l'espace sont vraiment une préoccupation, je ne les utilise pas non plus. Vous voudrez peut-être regarder BSON.
Techniquement YAML offre beaucoup plus que JSON (YAML v1.2 est un sur-ensemble de JSON):
ancres et héritage - exemple de 3 objets identiques:
item1: &anchor_name
name: Test
title: Test title
item2: *anchor_name
item3:
<<: *anchor_name
# You may add extra stuff.
La plupart du temps, les utilisateurs n'utilisent pas ces fonctionnalités supplémentaires. La principale différence est que YAML utilise l'indentation tandis que JSON utilise des crochets. Cela rend YAML plus concis et lisible _ (pour l'œil entraîné).
Lequel choisir?
Comme cette question occupe désormais une place importante dans la recherche de YAML et de JSON, il est intéressant de noter une différence rarement citée entre les deux: la licence. JSON prétend avoir une licence que les utilisateurs de JSON doivent adhérer (y compris la légalement ambiguë "doit être utilisé pour le bien et non pour le mal") YAML ne revendique pas de licence de ce type, ce qui pourrait constituer une différence importante (pour votre avocat, sinon pour vous).
Parfois, vous n'avez pas à choisir l'un par rapport à l'autre.
Dans Go, par exemple, vous pouvez avoir les deux en même temps:
type Person struct {
Name string `json:"name" yaml:"name"`
Age int `json:"age" yaml:"age"`
}
JSON ne peut pas gérer des données volumineuses.
Ne convient pas pour gérer différents formats multimédia.
JSON ne dispose pas d'une fonctionnalité permettant de prendre en charge les commentaires. Cela pourrait être inclus en tant qu'attribut supplémentaire uniquement.
YAML présente certains avantages par rapport à JSON, comme l'auto-référence, la prise en charge de types de données complexes, les littéraux de bloc incorporés, les commentaires, etc.
Je trouve que YAML et JSON sont très efficaces. Les deux seules choses qui dictent vraiment quand l’on utilise l’un sur l’autre, c’est l’un avec lequel le langage est le plus utilisé. Par exemple, si j'utilise Java, Javascript, j'utilise JSON. Pour Java, je vais utiliser leurs propres objets, qui sont à peu près JSON mais qui manquent de certaines fonctionnalités, et le convertir en JSON si besoin est, ou le créer en JSON en premier lieu. Je le fais parce que c'est une chose courante en Java et qu'il est plus facile pour les autres développeurs Java de modifier mon code. La deuxième chose est de savoir si je l'utilise pour que le programme se souvienne des attributs, ou si le programme reçoit des instructions sous la forme d'un fichier de configuration. Dans ce cas, j'utiliserai YAML, car il est très facile à lire, a Nice Il est très facile de modifier la syntaxe, même si vous n’avez aucune idée du fonctionnement de YAML. Ensuite, le programme le lira et le convertira en JSON, ou ce qui est préféré pour cette langue .
En fin de compte, cela n'a pas d'importance. JSON et YAML sont facilement lisibles par tout programmeur expérimenté.