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)

J’avais l’intention d’utiliser l’un de ces deux systèmes embarqués pour stocker les fichiers de configuration.

En relation:

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

Techniquement, YAML est un sur-ensemble de JSON. Cela signifie que, en théorie du moins, un parsingur YAML peut comprendre JSON, mais pas nécessairement l’inverse.

Voir les spécifications officielles, dans la section intitulée “YAML: Relation to JSON” .

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

  • Comme @jdupont l’a souligné , YAML est visuellement plus facile à regarder. En fait, la page d’accueil de YAML est elle-même valide, mais il est facile à lire pour un humain.
  • 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 des informations relationnelles comme on pourrait le trouver dans une firebase database MySQL.
  • YAML est plus robuste en ce qui concerne 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 .

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 parsingur JSON “assez bon” très rapidement
  4. Les clés en double, qui sont potentiellement JSON valides, sont définitivement non valides.
  5. YAML a une tonne de fonctionnalités, y compris des commentaires et des ancres relationnelles. La syntaxe YAML est donc assez complexe et peut être difficile à comprendre.
  6. Il est possible d’écrire des structures récursives dans yaml: {a: &b [*b]} , qui vont se boucler à l’infini dans certains convertisseurs. Même avec une détection circulaire, une “bombe d’igname” est toujours 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’object 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 d’ 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 parenthèses pour indiquer les niveaux.
  2. De nombreux programmeurs considèrent l’attachement au «sens» comme un mauvais choix.
  3. Si le format de données quitte l’environnement d’une application, 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.

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;

  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 pouvant être directement interprété et écrit à l’intérieur de JavaScript, en utilisant un raccourci pour déclarer JSON, ne nécessitant pas de guillemets doubles.
  3. Il existe une pléthore d’parsingurs 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 de nombreux cas, car le formatage nécessite une approche plus lisible par l’homme.
  5. L’espace blanc de YAML, tout en étant plus compact et plus facile à regarder, peut être difficile à modifier manuellement si vous ne disposez pas d’indicateurs de lignes visibles ou d’indentation dans votre éditeur.
  6. JSON est beaucoup plus rapide à sérialiser et à désérialiser en raison des fonctionnalités nettement moins nombreuses que YAML à vérifier, 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 ceci est complètement faux. Les espaces blancs étant invisibles, il semble y avoir moins de caractères, mais si vous comptez les espaces nécessaires pour que YAML soit interprété correctement avec une indentation correcte, vous constaterez que YAML nécessite plus de caractères que JSON. JSON n’utilise pas d’espaces blancs pour représenter la hiérarchie ou le regroupement et peut être facilement aplati avec des espaces inutiles supprimés pour un transport plus compact.

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

JavaScript domine clairement le Web par une énorme marge et les développeurs JavaScript préfèrent utiliser JSON comme format de données de manière écrasante avec les API Web populaires. Il est donc difficile de discuter de l’utilisation de YAML sur JSON lors de la programmation Web. dans un environnement d’équipe. En fait, la majorité des programmeurs Web ne savent même pas que YAML existe, et encore moins envisagent 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 requirejse lorsque vous travaillez avec JavaScript. Vous devez donc trouver un meilleur argument pour utiliser YAML sur JSON dans ce cas.

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

La vitesse

Evidemment, cela dépend de l’implémentation, mais comme JSON est si largement utilisé et si facile à implémenter, il a eu tendance à recevoir un support natif plus important, et donc plus rapide. Considérant que YAML fait tout ce que fait JSON, plus un chargement plus important, il est probable que le JSON sera plus rapide sur toutes les implémentations comparables des deux.

Cependant, étant donné qu’un fichier YAML peut être légèrement plus petit que son homologue JSON (à cause de moins de caractères), il est possible qu’un parsingur 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 parsingur YAML serait plus efficace en termes de mémoire qu’un parsingur 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 vais faire ces observations:

  • Il est facile de mémoriser l’intégralité de la syntaxe de JSON, et donc d’être très confiant sur la compréhension de la signification de tout fichier JSON. YAML n’est pas vraiment compréhensible par aucun humain. Le nombre de subtilités et de cas extrêmes est extrême.
  • Étant donné que peu de parseurs implémentent l’intégralité de la spécification, il est encore plus difficile d’être certain de la signification d’une expression donnée dans un contexte donné.
  • L’absence de commentaires dans JSON est, en pratique, une véritable douleur.

Portabilité

Il est difficile d’imaginer un langage moderne sans bibliothèque JSON. Il est également difficile d’imaginer un parsingur JSON implémentant moins que la spécification complète. YAML a un support étendu, mais est moins omniprésent que JSON, et chaque parsingur implémente un sous-ensemble différent. Les fichiers YAML sont donc moins interopérables que vous ne le pensez.

Résumé

JSON est le gagnant pour la performance (si pertinent) et l’interopérabilité. YAML est préférable 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.

Je trouve que YAML est plus facile pour les yeux: moins de parenthèses, “” etc. Bien que les tabs de YAML gênent … mais on y arrive.

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?

Si vous n’avez pas besoin des fonctionnalités de YAML et si JSON ne le fait pas, je préférerais JSON car il est très simple et largement supporté (il y 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’parsing ou l’utilisation de la mémoire sera très différente, et peut-être pas une grande partie des performances de votre programme.

GIT et YAML

Les autres réponses sont bonnes. Lisez-les en premier. Mais j’appendai parfois une autre raison d’utiliser YAML: git .

De plus en plus, de nombreux projets de programmation utilisent des référentiels git pour la dissortingbution et l’archivage. Et, bien que l’historique d’un repository git puisse également stocker des fichiers JSON et YAML, la méthode “diff” utilisée pour suivre et afficher les modifications apscopes à un fichier est orientée ligne. Étant donné que YAML est forcé à être orienté vers la ligne, toute modification mineure dans un fichier YAML est plus facile à voir par un humain.

Il est vrai que les fichiers JSON peuvent être “rendus jolis” en sortingant les chaînes / clés et en ajoutant une indentation. Mais ce n’est pas le défaut et je suis paresseux.

Personnellement, j’utilise généralement JSON pour l’interaction de 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’append des ancres relationnelles YAML. La vie est trop courte pour traquer les boucles.)

De plus, si la vitesse et l’espace sont vraiment un problème, je n’utilise pas non plus. Vous pourriez vouloir regarder BSON.

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

  • commentaires
  • ancres et inheritance – 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 utilisateurs n'utiliseront pas ces fonctionnalités supplémentaires et la principale différence est que YAML utilise l'indentation tandis que JSON utilise des parenthèses . Cela rend YAML plus concis et lisible (pour l'œil entrainé).

Lequel choisir?

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

Étant donné que cette question occupe désormais une place importante lors de la recherche de YAML et JSON, il convient de noter une différence rarement citée entre les deux: la licence. JSON prétend avoir une licence à laquelle les utilisateurs JSON doivent adhérer (y compris les termes “ambiguës” doivent être utilisés pour Good, pas Evil). YAML ne revendique pas une telle demande de licence et cela pourrait constituer une différence importante (pour votre avocat, sinon pour vous).

Parfois, vous n’avez pas à choisir l’un pour l’autre.

Dans Go, par exemple, vous pouvez avoir les deux en même temps:

 type Person struct { Name ssortingng `json:"name" yaml:"name"` Age int `json:"age" yaml:"age"` } 

Je trouve YAML et JSON très efficaces. Les deux seules choses qui dictent vraiment quand on s’utilise l’une sur l’autre, c’est celle avec laquelle la langue est la plus utilisée. Par exemple, si j’utilise Java, Javascript, j’utiliserai JSON. Pour Java, je vais utiliser leurs propres objects, qui sont à peu près JSON mais qui manquent de certaines fonctionnalités, et les convertir en JSON si nécessaire ou en JSON. Je le fais parce que c’est une chose courante en Java et permet aux autres développeurs Java de modifier plus facilement mon code. La deuxième chose est de savoir si je l’utilise pour que le programme se souvienne des atsortingbuts, ou si le programme reçoit des instructions sous la forme d’un fichier de configuration, dans ce cas je vais utiliser YAML, car il est très facile à lire. regarder la syntaxe, et est très facile à modifier, même si vous ne savez pas comment fonctionne YAML. Ensuite, le programme le lira et le convertira en JSON, ou tout ce qui est préféré pour cette langue.

En fin de compte, ça n’a pas d’importance. JSON et YAML sont facilement lisibles par tout programmeur expérimenté.