Question 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 sur JSON et vice versa, en considérant les choses suivantes?

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

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

En relation:

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


504
2017-11-13 02:42


origine


Réponses:


Techniquement, YAML est un surensemble de JSON. Cela signifie que, en théorie du moins, un analyseur YAML peut comprendre JSON, mais pas nécessairement l'inverse.

Voir les spécifications officielles, dans la section intitulée "YAML: Relation à JSON".

En général, il y a certaines choses que j'aime dans YAML qui ne sont pas disponibles dans JSON.

  • Comme @jdupont a fait remarquer, YAML est visuellement plus facile à regarder. En fait, le Page d'accueil YAML est lui-même valide YAML, mais il est facile pour un humain de lire.
  • YAML a la possibilité de référencer d'autres éléments dans un fichier YAML en utilisant des "ancres". Ainsi, il peut gérer les informations relationnelles comme on pourrait le trouver dans une base de données MySQL.
  • YAML est plus robuste sur l'intégration 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 les choses que vous ou moi 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 utilisé davantage 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, alors que JSON ne l’est pas.

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.


495
2017-11-13 14:28



Différences:

  1. YAML, selon son utilisation, peut être plus lisible que JSON
  2. JSON est souvent plus rapide et est probablement encore interopérable avec plus de systèmes
  3. Il est possible d'écrire un analyseur JSON "assez bon" très rapidement
  4. Clés en double, qui sont potentiellement JSON valide, sont absolument 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 se bouclera à l'infini dans certains convertisseurs. Même avec la détection circulaire, une "bombe de yaml" est encore possible (voir bombe xml).
  7. Comme il n'y a pas de références, il est impossible de sérialiser des structures complexes avec des références d'objet dans 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, en raison de l'utilisation de l'indentation, plutôt que de la syntaxe entre parenthèses, pour indiquer les niveaux.
  2. Beaucoup de 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 être un meilleur choix.
  4. YAML peut être utilisé, directement, pour des tâches complexes telles que les définitions grammaticales. C'est souvent un meilleur choix que d'inventer un nouveau langage.

119
2018-06-07 14:17



Contourner la théorie ésotérique

Cela répond au titre, pas aux détails car la plupart des lecteurs lisent simplement le titre d'un résultat de recherche sur google comme moi donc j'ai senti 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 et peuvent être directement interprétés et écrits en JavaScript, tout en utilisant un raccourci pour déclarer JSON, sans avoir à utiliser de guillemets doubles dans les clés.
  3. Il existe une pléthore d’analyseurs qui fonctionnent très bien dans toutes les langues pour YAML et JSON.
  4. Le format d'espacement de YAML peut être beaucoup plus facile à regarder dans la plupart des cas, car le formatage nécessite une approche plus lisible par l'homme.
  5. Les espaces de YAML tout en étant plus compact et plus facile à regarder peuvent être trompeusement difficiles à éditer manuellement si vous n'avez pas d'espace visible ou d'indentation dans votre éditeur.
  6. JSON est beaucoup plus rapide à sérialiser et à désérialiser en raison de fonctionnalités nettement inférieures à celles de YAML, ce qui permet à un code plus petit et plus léger de traiter JSON.
  7. Une idée fausse commune est que YAML a besoin de moins de ponctuation et est plus compact que JSON mais c'est complètement faux. Les espaces blancs sont invisibles, donc il semble qu'il y ait moins de caractères, mais si vous comptez l'espace réel nécessaire pour que YAML soit interprété correctement avec une indentation correcte, vous trouverez que YAML nécessite réellement plus de caractères que JSON. JSON n'utilise pas les espaces pour représenter la hiérarchie ou le regroupement et peut être facilement aplati en supprimant les espaces inutiles pour un transport plus compact.

L'éléphant dans la pièce: l'Internet lui-même

Les développeurs JavaScript préfèrent utiliser JSON comme format de données avec les API Web populaires. Il devient donc difficile d'argumenter en utilisant YAML sur JSON quand on fait de la programmation web dans le sens général, car vous serez probablement mis en minorité. dans un environnement d'équipe. En fait, la majorité des programmeurs Web ne savent même pas que YAML existe, et 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 travaillez avec JavaScript. Vous devez donc trouver un meilleur argument pour utiliser YAML sur JSON dans ce cas.


55
2018-01-23 02:40



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

La vitesse

Évidemment, cela dépend de l'implémentation, mais parce que JSON est si largement utilisé, et si facile à implémenter, il a eu tendance à recevoir un plus grand support natif, et donc plus rapide. Considérant que YAML fait tout ce que fait JSON, plus un chargement de camion, 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 de " et , caractères), c'est possible qu'un parseur YAML hautement optimisé pourrait être 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 termes de 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 les programmeurs JavaScript YAML à JSON. Je ferai ces observations:

  • Il est facile de mémoriser toute la syntaxe de JSON, et donc d'être très sûr de comprendre la signification de n'importe quel fichier JSON. YAML n'est vraiment compréhensible par aucun humain. Le nombre de subtilités et de cas de contour est extrême.
  • Comme peu d'analyseurs implémentent la totalité de la spécification, il est encore plus difficile d'être certain de la signification d'une expression donnée dans un contexte donné.
  • Le manque de commentaires dans JSON est, en pratique, une vraie douleur.

Portabilité

Il est difficile d'imaginer une langue moderne sans une bibliothèque JSON. Il est également difficile d'imaginer un analyseur JSON implémentant quelque chose de moins que la spécification complète. YAML a un support étendu, mais est moins répandu 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 la performance (le cas échéant) et l'interopérabilité. YAML est meilleur pour les fichiers gérés par l'homme. HJSON est un compromis décent mais avec une portabilité très réduite. JSON5 est un compromis plus raisonnable, avec une syntaxe bien définie.


22
2018-04-12 13:36



Je trouve que YAML est plus facile pour les yeux: moins de parenthèses, "" etc. Bien qu'il y ait l'agacement des onglets dans YAML ... mais on s'y associe.

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é d'encodage / décodage, non?


20
2017-11-13 02:46



Si vous n'avez pas besoin de fonctionnalités que YAML a et JSON non, je préférerais JSON parce que c'est très simple et est largement supporté (a beaucoup de bibliothèques dans de nombreuses langues). YAML est plus complexe et a moins de soutien. 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.


17
2017-11-13 02:50



GIT et YAML

Les autres réponses sont bonnes. Lisez ceux en premier. Mais je vais ajouter une autre raison d'utiliser YAML parfois: git.

De plus en plus, de nombreux projets de programmation utilisent des dépôts git pour la distribution et l'archivage. Et, bien que l'historique d'un dépôt 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. Comme YAML est obligé d'être orienté ligne, toutes les petites modifications dans un fichier YAML sont plus faciles à voir par un humain.

Il est vrai, bien entendu, que les fichiers JSON peuvent être "rendus jolis" en triant les chaînes / clés et en ajoutant l'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 n’utilise pas non plus. Vous pourriez vouloir regarder BSON.


9
2018-03-23 19:35



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 gens n'utiliseront pas ces fonctionnalités supplémentaires et 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 exercé).

Lequel choisir?

  • YAML caractéristiques supplémentaires et notation concise en fait un bon choix pour fichiers de configuration (fichiers non fournis par l'utilisateur).
  • JSON caractéristiques limitées, prise en charge étendue et analyse plus rapide en font un excellent choix pour l'interopérabilité et données fournies par l'utilisateur.

8
2018-03-03 13:31