web-dev-qa-db-fra.com

Quelle est la différence entre YAML et JSON? Quand préférer l'un à l'autre

Quand devrions-nous préférer utiliser YAML par rapport à JSON et inversement, en tenant compte des points suivants?

  • Performance (temps d'encodage/décodage)
  • Consommation de mémoire
  • Clarté de l'expression
  • Disponibilité de la bibliothèque, facilité d'utilisation (je préfère C)

Je prévoyais d'utiliser l'un de ces deux systèmes dans notre système intégré pour stocker les fichiers de configuration.

En relation:

Devrais-je utiliser YAML ou JSON pour stocker mes données Perl?

569
pierrotlefou

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. 

  • Comme l'a souligné @jdupont , YAML est visuellement plus facile à regarder. En fait, la page d'accueil YAML est elle-même un YAML valide, mais il est facile à lire pour un humain. 
  • YAML a la capacité de référencer d'autres éléments dans un fichier YAML en utilisant des "ancres". Ainsi, il peut gérer des informations relationnelles, comme dans une base de données MySQL. 
  • YAML est plus robuste pour incorporer d'autres formats de sérialisation tels que JSON ou XML dans un fichier YAML. 

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

550
AndyL

Différences:

  1. YAML, selon l'utilisation que vous en faites, peut être plus lisible que JSON
  2. JSON est souvent plus rapide et est probablement toujours interopérable avec plus de systèmes
  3. Il est possible d'écrire très rapidement un analyseur JSON "assez bon"
  4. Les clés en double, qui sont potentiellement JSON valide, sont certainement YAML non valide.
  5. YAML a une tonne de fonctionnalités, y compris des commentaires et des ancres relationnelles. La syntaxe YAML est par conséquent assez complexe et peut être difficile à comprendre.
  6. Il est possible d'écrire des structures récursives dans yaml: {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 ).
  7. En l'absence de références, il est impossible de sérialiser des structures complexes avec des références d'objet en JSON. La sérialisation YAML peut donc être plus efficace.
  8. Dans certains environnements de codage, l’utilisation de YAML peut permettre à un attaquant de exécuter du code arbitraire

Observations:

  1. Les programmeurs Python sont généralement de grands fans de YAML, car ils utilisent l'indentation plutôt que la syntaxe entre crochets pour indiquer les niveaux. 
  2. De nombreux programmeurs considèrent l'attachement du "sens" à l'indentation comme un mauvais choix.
  3. Si le format de données quitte l'environnement d'une application, est analysé dans une interface utilisateur ou envoyé dans une couche de messagerie, JSON peut constituer un meilleur choix.
  4. YAML peut être utilisé, directement, pour des tâches complexes telles que la définition de la grammaire et constitue souvent un meilleur choix que l’invention d’un nouveau langage. 
153
Erik Aronesty

Contourner la théorie ésotérique

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 .

  1. YAML utilise l'indentation d'espaces, qui est un territoire familier pour les développeurs Python.
  2. Les développeurs JavaScript adorent JSON, car il s'agit d'un sous-ensemble de JavaScript qui peut être interprété et écrit directement dans JavaScript. Il est également possible d'utiliser une méthode abrégée pour déclarer JSON, sans requérir de doubles guillemets dans les clés lorsque vous utilisez des noms de variables typiques sans espaces.
  3. Il existe une pléthore d'analyseurs syntaxiques qui fonctionnent très bien dans toutes les langues pour YAML et JSON.
  4. Le format d'espaces blancs de YAML peut être beaucoup plus facile à examiner dans la plupart des cas, car le formatage nécessite une approche plus lisible par l'homme.
  5. Les espaces blancs de YAML, tout en étant plus compacts et plus faciles à observer, peuvent être difficiles à modifier manuellement si vous n’avez pas d’indicateurs de lignes d’indentation ou de lignes d’indentation dans votre éditeur.
  6. JSON est beaucoup plus rapide à sérialiser et à désérialiser en raison du nombre nettement inférieur de fonctionnalités à contrôler par YAML, ce qui permet à un code plus petit et plus léger de traiter JSON.
  7. Une idée fausse commune est que YAML nécessite moins de ponctuation et est plus compact que JSON, mais que cela est complètement faux. Les espaces sont invisibles, il semble donc qu'il y ait moins de caractères, mais si vous comptez les espaces réellement nécessaires pour que YAML soit interprété correctement avec l'indentation appropriée, vous constaterez que YAML nécessite en réalité plus de caractères que JSON. JSON n'utilise pas d'espaces pour représenter une hiérarchie ou un groupe et peut être facilement aplati en supprimant les espaces inutiles pour un transport plus compact.

L'éléphant dans la salle: Internet lui-même

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.

70
Jason Sebring

Cette question a 6 ans, mais étrangement, aucune des réponses ne traite vraiment des quatre points (vitesse, mémoire, expressivité, portabilité).

La vitesse

É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.

Mémoire

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.

Expressivité

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 facile de mémoriser la syntaxe complète de JSON et par conséquent d’être très confiant quant à la signification de tout fichier JSON. YAML n'est vraiment compréhensible par aucun humain. Le nombre de subtilités et de cas Edge est extrême.
  • Comme peu d'analyseurs implémentent l'intégralité de la spécification, il est encore plus difficile de savoir avec certitude le sens d'une expression donnée dans un contexte donné. 
  • Le manque de commentaires dans JSON est, dans la pratique, une vraie douleur.

Portabilité

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.

Résumé

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.

27
Steve Bennett

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?

21
jldupont

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.

18
user181548

GIT et YAML

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.

13
JohnAD

Techniquement YAML offre beaucoup plus que JSON (YAML v1.2 est un sur-ensemble de JSON):

  • commentaires
  • 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?

  • YAML des fonctionnalités supplémentaires et une notation concise en font un bon choix pour les fichiers de configuration (fichiers non fournis par l'utilisateur).
  • JSON fonctionnalités limitées, support étendu et analyse plus rapide en font un excellent choix pour l'interopérabilité et les données fournies par l'utilisateur.
8
Wernight

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).

3
Mvr39

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"`
}
2
Michael Dorner
  • 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.

  • JSON est uniquement lisible alors que YAML peut être lisible et éditable.
  • JSON est un sous-ensemble de YAML afin que les analyseurs syntaxiques YAML puissent analyser JSON.
  • YAML n'utilise pas de délimiteurs supplémentaires. Donc, il est plus léger que XML et JSON.
0
Premraj

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é.

0
Triforcey