959 Stimmen

Was ist der Unterschied zwischen YAML und JSON?

Was sind die Unterschiede zwischen YAML und JSON, insbesondere im Hinblick auf die folgenden Punkte?

  • Leistung (Kodier-/Dekodierzeit)
  • Speicherverbrauch
  • Klarheit des Ausdrucks
  • Verfügbarkeit der Bibliothek, Benutzerfreundlichkeit (ich bevorzuge C)

Ich hatte vor, eine dieser beiden in unserem eingebetteten System zu verwenden, um Konfigurationsdateien zu speichern.

Verwandt:

Soll ich YAML oder JSON zur Speicherung meiner Perl-Daten verwenden?

824voto

AndyL Punkte 13674

Technisch gesehen ist YAML eine Obermenge von JSON. Das bedeutet, dass ein YAML-Parser, zumindest theoretisch, JSON verstehen kann, aber nicht unbedingt umgekehrt.

Siehe die offiziellen technischen Daten im Abschnitt "YAML: Das Verhältnis zu JSON" .

Generell gibt es einige Dinge, die ich an YAML schätze und die in JSON nicht vorhanden sind.

  • Comme @jdupont wies darauf hin YAML ist visuell einfacher zu betrachten. In der Tat ist die YAML-Startseite ist selbst gültiges YAML, das jedoch für einen Menschen leicht zu lesen ist.
  • YAML verfügt über die Möglichkeit, innerhalb einer YAML-Datei mit Hilfe von "Ankern" auf andere Elemente zu verweisen. Somit können relationale Informationen, wie sie in einer MySQL-Datenbank vorkommen, verarbeitet werden.
  • YAML ist robuster bei der Einbettung anderer Serialisierungsformate wie JSON oder XML innerhalb eine YAML-Datei.

In der Praxis wird keiner der beiden letzten Punkte eine Rolle spielen, aber langfristig denke ich, dass YAML ein robusteres und praktikableres Format zur Datenserialisierung sein wird.

Zurzeit verwenden AJAX und andere Webtechnologien in der Regel JSON. YAML wird derzeit eher für Offline-Datenprozesse verwendet. So ist es beispielsweise standardmäßig im C-basierten OpenCV-Paket für Computer Vision enthalten, JSON hingegen nicht.

Sie finden C-Bibliotheken sowohl für JSON als auch für YAML. Die YAML-Bibliotheken sind tendenziell neuer, aber ich hatte in der Vergangenheit keine Probleme mit ihnen. Siehe zum Beispiel Yaml-cpp .

281voto

Erik Aronesty Punkte 9973

Die Unterschiede:

  1. YAML kann, je nach Verwendung, besser lesbar sein als JSON
  2. JSON ist oft schneller und ist wahrscheinlich noch mit weiteren Systemen interoperabel
  3. Es ist möglich, sehr schnell einen JSON-Parser zu schreiben, der "gut genug" ist.
  4. Doppelte Schlüssel, die Möglicherweise gültiges JSON, sind definitiv ungültige YAML.
  5. YAML verfügt über eine Vielzahl von Funktionen, darunter Kommentare und relationale Anker. Die YAML-Syntax ist dementsprechend recht komplex und kann schwer zu verstehen sein.
  6. Es ist möglich, rekursive Strukturen in yaml zu schreiben: {a: &b [*b]} was bei einigen Konvertern zu einer Endlosschleife führt. Selbst mit einer zirkulären Erkennung ist eine "Yaml-Bombe" immer noch möglich (siehe xml-Bombe ).
  7. Da es keine Referenzen gibt, ist es unmöglich, komplexe Strukturen mit Objektreferenzen in JSON zu serialisieren. Die YAML-Serialisierung kann daher effizienter sein.
  8. In manchen Codierungsumgebungen kann die Verwendung von YAML einem Angreifer die Möglichkeit geben willkürlichen Code ausführen .

Beobachtungen:

  1. Python-Programmierer sind im Allgemeinen große Fans von YAML, da die Ebenen durch Einrückung und nicht durch Klammern angegeben werden.
  2. Viele Programmierer halten die Bindung von "Bedeutung" an die Einrückung für eine schlechte Wahl.
  3. Wenn das Datenformat die Umgebung einer Anwendung verlässt, in einer Benutzeroberfläche geparst oder in einer Nachrichtenschicht gesendet wird, ist JSON möglicherweise die bessere Wahl.
  4. YAML kann direkt für komplexe Aufgaben wie z.B. Grammatikdefinitionen verwendet werden und ist oft die bessere Wahl, als eine neue Sprache zu erfinden.

123voto

King Friday Punkte 22596

Umgehung der esoterischen Theorie

Dies ist eine Antwort auf den Titel, nicht auf die Details, da die meisten nur den Titel von einem Suchergebnis auf Google lesen, so wie ich, also hielt ich es für notwendig zu erklären aus der Sicht eines Webentwicklers .

  1. YAML verwendet eine Leerzeicheneinrückung, die Python-Entwicklern vertraut ist.
  2. JavaScript-Entwickler lieben JSON, weil es eine Teilmenge von JavaScript ist und direkt innerhalb von JavaScript interpretiert und geschrieben werden kann. Außerdem kann JSON in Kurzform deklariert werden, da keine doppelten Anführungszeichen in Schlüsseln erforderlich sind, wenn typische Variablennamen ohne Leerzeichen verwendet werden.
  3. Es gibt eine Fülle von Parsern, die in allen Sprachen sowohl für YAML als auch für JSON sehr gut funktionieren.
  4. Das Space-Format von YAML kann in vielen Fällen wesentlich übersichtlicher sein, da die Formatierung einen besser lesbaren Ansatz erfordert.
  5. Die Form von YAML ist zwar kompakter und übersichtlicher, lässt sich aber nur schwer von Hand editieren, wenn Sie in Ihrem Editor keine Leerzeichenformatierung sehen. Tabulatoren sind keine Leerzeichen, so dass weitere Verwirrung, wenn Sie nicht über einen Editor, um Ihre Tastatureingaben in Leerzeichen zu interpretieren.
  6. JSON lässt sich wesentlich schneller serialisieren und deserialisieren, da deutlich weniger Merkmale als bei YAML zu prüfen sind, was die Verarbeitung von JSON mit kleinerem und leichterem Code ermöglicht.
  7. Ein häufiges Missverständnis ist, dass YAML weniger Interpunktion benötigt und kompakter ist als JSON, aber das ist völlig falsch. Whitespace ist unsichtbar, so dass es den Anschein hat, als gäbe es weniger Zeichen, aber wenn Sie die tatsächlichen Leerzeichen zählen, die vorhanden sein müssen, damit YAML zusammen mit der richtigen Einrückung richtig interpretiert werden kann, werden Sie feststellen, dass YAML tatsächlich mehr Zeichen benötigt als JSON. JSON verwendet keine Leerzeichen, um Hierarchien oder Gruppierungen darzustellen, und kann für einen kompakteren Transport einfach um unnötige Leerzeichen bereinigt werden.

Der Elefant im Raum: Das Internet selbst

JavaScript dominiert das Web mit großem Abstand und JavaScript-Entwickler bevorzugen JSON als Datenformat in Verbindung mit populären Web-APIs, so dass es schwierig ist, bei der Webprogrammierung im allgemeinen Sinne YAML gegenüber JSON zu bevorzugen, da man in einer Teamumgebung wahrscheinlich überstimmt wird. Tatsächlich weiß die Mehrheit der Webprogrammierer nicht einmal, dass es YAML gibt, geschweige denn, dass sie es verwenden würden.

Bei der Webprogrammierung ist JSON die Standardlösung, da bei der Arbeit mit JavaScript kein Übersetzungsschritt erforderlich ist. In diesem Fall müssen Sie ein besseres Argument für die Verwendung von YAML gegenüber JSON finden.

77voto

Steve Bennett Punkte 97061

Diese Frage ist 6 Jahre alt, aber seltsamerweise geht keine der Antworten wirklich auf alle vier Punkte ein (Geschwindigkeit, Speicher, Ausdrucksfähigkeit, Portabilität).

Geschwindigkeit

Natürlich hängt dies von der Implementierung ab, aber da JSON so weit verbreitet und so einfach zu implementieren ist, wird es in der Regel von den Einheimischen stärker unterstützt und ist daher schneller. Wenn man bedenkt, dass YAML alles kann, was JSON kann, und noch eine ganze Menge mehr, ist es wahrscheinlich, dass von allen vergleichbaren Implementierungen beider Formate die JSON-Implementierung schneller sein wird.

Da eine YAML-Datei jedoch etwas kleiner sein kann als ihr JSON-Gegenstück (aufgrund weniger " y , Zeichen), ist es möglich dass ein hochoptimierter YAML-Parser in Ausnahmefällen schneller sein kann.

Speicher

Im Grunde gilt das gleiche Argument. Es ist nicht einzusehen, warum ein YAML-Parser jemals speichereffizienter sein sollte als ein JSON-Parser, wenn beide die gleiche Datenstruktur repräsentieren.

Ausdruckskraft

Wie bereits erwähnt, bevorzugen Python-Programmierer eher YAML, JavaScript-Programmierer eher JSON. Ich werde diese Beobachtungen machen:

  • Es ist einfach, sich die gesamte JSON-Syntax einzuprägen und somit die Bedeutung jeder JSON-Datei zu verstehen. YAML ist für einen Menschen nicht wirklich verständlich. Die Anzahl der Feinheiten und Randfälle ist extrem.
  • Da nur wenige Parser die gesamte Spezifikation implementieren, ist es noch schwieriger, sich über die Bedeutung eines bestimmten Ausdrucks in einem bestimmten Kontext sicher zu sein.
  • Das Fehlen von Kommentaren in JSON ist in der Praxis ein echtes Problem.

Tragbarkeit

Es ist schwer, sich eine moderne Sprache ohne eine JSON-Bibliothek vorzustellen. Es ist auch schwer vorstellbar, dass ein JSON-Parser weniger als die vollständige Spezifikation implementiert. YAML wird zwar weitgehend unterstützt, ist aber nicht so weit verbreitet wie JSON, und jeder Parser implementiert eine andere Teilmenge. Daher sind YAML-Dateien weniger interoperabel, als Sie vielleicht denken.

Zusammenfassung

JSON ist der Gewinner in Bezug auf Leistung (falls relevant) und Interoperabilität. YAML ist besser für von Menschen gepflegte Dateien. HJSON ist ein guter Kompromiss, wenn auch mit deutlich eingeschränkter Tragbarkeit. JSON5 ist ein vernünftigerer Kompromiss mit einer klar definierten Syntax.

57voto

JohnAD Punkte 819

GIT und YAML

Die anderen Antworten sind gut. Lesen Sie diese zuerst. Aber ich möchte noch einen weiteren Grund hinzufügen, warum man YAML manchmal verwenden sollte: git .

Immer mehr Programmierprojekte verwenden Git-Repositories für die Verteilung und Archivierung. Während die Historie eines Git-Repos JSON- und YAML-Dateien gleichermaßen speichern kann, ist die "diff"-Methode, mit der Änderungen an einer Datei verfolgt und angezeigt werden können, zeilenorientiert. Da YAML zwangsläufig zeilenorientiert ist, sind kleine Änderungen in einer YAML-Datei für einen Menschen leichter zu erkennen.

Es stimmt natürlich, dass JSON-Dateien "hübsch" gemacht werden können, indem man die Strings/Schlüssel sortiert und Einrückungen hinzufügt. Aber das ist nicht der Standard und ich bin faul.

Ich persönlich verwende JSON im Allgemeinen für die Interaktion zwischen den Systemen. Für Konfigurationsdateien, statische Dateien und getrackte Dateien verwende ich oft YAML. (Außerdem vermeide ich es im Allgemeinen, YAML-Beziehungsanker hinzuzufügen. Das Leben ist zu kurz, um nach Schleifen zu suchen).

Wenn es wirklich um Geschwindigkeit und Platz geht, benutze ich auch keine von beiden. Sie sollten sich vielleicht BSON ansehen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X