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

quand devrions-nous préférer utiliser YAML plutôt que JSON et vice versa, en considérant les choses suivantes?

    "151930920 de Performance" (encodage/décodage de temps)
  • consommation de mémoire
  • clarté de L'Expression
  • disponibilité de la bibliothèque, facilité d'utilisation (je préfère C)

j'avais l'intention d'utiliser une de ces deux dans notre système intégré pour stocker configurer les fichiers.

Related:

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

521
demandé sur Community 2009-11-13 05:42:47

11 réponses

techniquement, YAML est un super-ensemble de JSON. Cela signifie que, en théorie du moins, un YAML parser 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 chez YAML qui ne sont pas disponibles chez JSON.

  • comme @jdupont a souligné , YAML est visuellement plus facile à regarder. En fait, le YAML homepage est lui-même valable YAML, mais il est facile pour un humain de lire.
  • YAML a la capacité de faire référence à d'autres articles dans un fichier YAML en utilisant des ancres."Ainsi, il peut traiter des informations relationnelles comme on pourrait 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.

dans la pratique, aucun de ces deux derniers points ne sera probablement important pour les choses que vous ou moi faisons, mais à long terme, je pense que YAML sera un format de sérialisation de données plus robuste et viable.

actuellement, 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 paquet OpenCV, alors que JSON 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 dans le passé. Voir, par exemple, Yaml-rpc .

518
répondu AndyL 2017-07-13 19:59:31

Différences:

  1. YAML, selon la façon dont vous l'utilisez, peut être plus lisible que JSON
  2. JSON est souvent plus vite et est probablement toujours interopérables avec d'autres systèmes
  3. il est possible d'écrire un" assez bon "JSON parser très rapidement
  4. des doubles de clés, qui sont potentiellement JSON valide, sont certainement YAML invalide.
  5. YAML a une tonne de fonctionnalités, y compris des commentaires et des ancres relationnelles. Syntaxe YAML est donc assez complexe, et peut être difficile à comprendre.
  6. il est possible d'écrire des structures récursives en yaml: {a: &b [*b]} , qui boucleront infiniment dans certains convertisseurs. Même avec une détection circulaire, une" bombe yaml "est encore possible (voir bombe xml ).
  7. parce qu'il n'y a pas de références, il est impossible de sérialiser des structures complexes avec des références d'objets 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 crochets, pour indiquer les niveaux.
  2. Beaucoup de programmeurs considèrent l'attachement du "sens" à l'indentation d'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 pourrait être un meilleur choix.
  4. YAML peut être utilisé, directement, pour des tâches complexes comme les définitions grammaticales, et est souvent un meilleur choix que d'inventer une nouvelle langue.
130
répondu Erik Aronesty 2018-07-20 18:53:10

en Contournant ésotérique théorie

cela répond au titre, pas aux détails comme la plupart viennent de lire le titre d'un résultat de recherche sur google comme moi, donc j'ai estimé qu'il était nécessaire d'expliquer d'un point de vue de développeur web .

  1. YAML utilise l'indentation de l'espace, qui est un territoire familier pour les développeurs Python.
  2. les développeurs JavaScript aiment JSON parce qu'il est un sous-ensemble de JavaScript et peut être directement interprété et écrit à L'intérieur de JavaScript, avec l'utilisation d'une façon abrégée de déclarer JSON, ne nécessitant pas de guillemets dans les clés lorsque vous utilisez des noms de variables typiques sans espaces.
  3. il y a une pléthore de parseurs qui fonctionnent très bien dans toutes les langues pour YAML et JSON.
  4. le format D'espace blanc de YAML peut être beaucoup plus facile à regarder dans de nombreux cas parce que le formatage nécessite une approche plus lisible par les humains.
  5. Les espaces blancs de YAML tout en étant plus compacts et plus faciles à regarder peuvent être trompeusement difficiles à éditer à la main si vous n'avez pas d'indicateurs de ligne d'indentation ou d'espace visible dans votre éditeur.
  6. JSON est beaucoup plus rapide à sérialiser et à desérialiser en raison de beaucoup moins de fonctionnalités que YAML à vérifier, ce qui permet de code plus petit et plus léger à traiter JSON.
  7. une idée fausse courante 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 blanc réel qui est nécessaire pour que YAML soit interprété correctement avec une bonne indentation, vous trouverez que YAML nécessite en fait plus de caractères que JSON. JSON n'utilise pas whitespace pour représenter la hiérarchie ou le groupement et peut être facilement aplati avec whitespace inutile enlevé pour le transport plus compact.

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

JavaScript domine si clairement le web par une marge énorme et les développeurs JavaScript préfèrent utiliser JSON que le format de données massivement avec les API Web populaires de sorte qu'il devient difficile de discuter en utilisant YAML sur JSON lors de la programmation web dans le sens général que vous serez probablement outvoted dans un environnement d'équipe. En fait, la majorité des programmeurs web ne sont même pas au courant YAML existe, laissez seul envisager de l'utiliser.

si vous faites de la programmation web, JSON est la solution par défaut car aucune étape de traduction n'est nécessaire lorsque vous travaillez avec JavaScript, alors vous devez trouver un meilleur argument pour utiliser YAML sur JSON dans ce cas.

57
répondu Jason Sebring 2018-01-16 19:07:31

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

vitesse

évidemment, cela dépend de la mise en œuvre, mais parce que JSON est si largement utilisé, et si facile à mettre en œuvre, il a eu tendance à recevoir un plus grand soutien natif, et donc de la vitesse. Si L'on considère que YAML fait tout ce que JSON fait, plus un camion chargé, il est probable que de tous les des implémentations comparables des deux, la JSON one sera plus rapide.

cependant, étant donné qu'un fichier YAML peut être légèrement plus petit que son équivalent JSON (en raison de moins de caractères " et , ), il est possible qu'un analyseur YAML hautement optimisé pourrait être plus rapide dans des circonstances exceptionnelles.

mémoire

essentiellement le même argument s'applique. C'est difficile de voir pourquoi un YAML parser plus efficace en mémoire qu'un analyseur JSON, s'ils représentent la même structure de données.

expressivité

comme noté par d'autres, les programmeurs Python ont tendance à préférer YAML, les programmeurs JavaScript à JSON. Je ferai ces observations:

  • il est facile de mémoriser toute la syntaxe de JSON, et donc être très confiant sur la compréhension de la signification de n'importe quel fichier JSON. YAML n'est pas vraiment compréhensible par un humain. Le nombre de subtilités et de cas de bord est extrême.
  • parce que peu d'analyseurs mettent en œuvre l'ensemble 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 en JSON est, dans la pratique, une vraie douleur.

portabilité

il est difficile d'imaginer une langue moderne sans bibliothèque JSON. Il est également difficile de imaginez un analyseur JSON implémentant quelque chose de moins que la spécification complète. YAML a un large soutien, mais est moins ubiquiste 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 mieux pour les fichiers humains. HJSON est un bon compromis mais avec beaucoup réduit la portabilité. JSON5 est un compromis plus raisonnable, avec une syntaxe bien définie.

23
répondu Steve Bennett 2017-10-31 03:44:16

je trouve YAML à être plus facile sur les yeux: de moins en moins entre parenthèses, "" etc. Bien qu'il y ait l'ennui des onglets dans YAML... mais on obtient le blocage de celui-ci.

en termes de performance/ressources, Je ne m'attendais pas à de grandes différences entre les deux.

de plus, nous parlons de fichiers de configuration et donc je ne m'attendrais pas à une fréquence élevée d'activité d'encodage/décodage, Non?

20
répondu jldupont 2009-11-13 02:46:45

si vous n'avez pas besoin de fonctionnalités que YAML A et JSON n'a pas, 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 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.

17
répondu 2009-11-13 02:50:50

Git and YAML

les autres réponses sont bonnes. A lire 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, alors que l'histoire d'un git repo peut également stocker des fichiers JSON et YAML, la méthode "diff" utilisée pour suivre et afficher les modifications à un fichier est orientée ligne. Puisque YAML est forcé d'être orienté ligne, tout petit changement dans 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/touches 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 ancrages YAML relationnels. La vie est trop courte pour traquer les boucles.)

aussi, si la vitesse et l'espace sont vraiment un problème, je n'utilise pas non plus. Vous voudrez peut-être regarder à BFILS.

11
répondu JohnAD 2018-03-23 19:41:20

techniquement YAML offre beaucoup plus que JSON (YAML v1.2 is a superset of JSON):

  • commentaires
  • ancres et héritage-exemple de 3 articles 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 ne vont pas utiliser ces fonctionnalités supplémentaires et le principal la différence est que YAML utilise l'indentation tandis que JSON utilise les parenthèses . Cela rend YAML plus concis et lisible (pour l'oeil entraîné).

Lequel choisir?

  • YAML caractéristiques supplémentaires et notation concise en fait un bon choix pour fichiers de configuration (non-utilisateurs fournis fichiers).
  • JSON des fonctionnalités limitées, un large support, et une analyse plus rapide en fait un excellent choix pour l'interopérabilité et données fournies par l'utilisateur .
8
répondu Wernight 2016-03-03 13:42:34

puisque cette question est maintenant en évidence lors de la recherche de YAML et JSON, il est intéressant de noter une différence rarement Citée entre les deux: licence. JSON prétend avoir une" licence 151910920 à laquelle les utilisateurs de JSON doivent adhérer (y compris l'ambigu juridique "doit être utilisé pour le bien, pas le mal"). YAML n'a pas de demande de licence de ce genre, et cela pourrait être une différence importante (pour votre avocat, si ce n'est pour vous).

3
répondu Mvr39 2016-09-20 07:18:59

Parfois, vous n'avez pas à décider pour l'une sur 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
répondu Michael Dorner 2017-12-07 08:00:22

je trouve que YAML et JSON sont très efficaces. Les deux seules choses qui dictent vraiment quand l'une est utilisée par rapport à l'autre pour moi sont une, CE avec quoi la langue est utilisée le plus populairement. Par exemple, si J'utilise Java, Javascript, J'utiliserai JSON. Pour Java, j'utiliserai leurs propres objets, qui sont à peu près JSON mais qui manquent de fonctionnalités, et je les convertirai en JSON si j'ai besoin de le faire ou de le faire en JSON en premier lieu. Je fais cela parce que C'est une chose commune à Java et rend plus facile pour d'autres développeurs Java pour 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, parce que C'est très facile à lire par les humains, a une belle syntaxe et est très facile à modifier, même si vous n'avez aucune idée de comment YAML fonctionne. Ensuite, le programme le lira et le convertira en JSON, ou ce qui est préféré pour cette langue.



En fin de compte, honnêtement il n'a pas d'importance. JSON et YAML sont facilement lus par n'importe quel programmeur expérimenté.

0
répondu Triforcey 2016-12-06 00:52:30