Unterschiede zwischen YAML und JSON

1. Übersicht

In diesem kurzen Artikel werden wir die Unterschiede zwischen YAML und JSON anhand schneller und praktischer Beispiele untersuchen.

2. Formatieren

Um ein besseres Bild zu erhalten, betrachten wir zunächst die JSON- und YAML-Darstellungen eines einfachen POJO:

class Person { String name; Integer age; List hobbies; Person manager; }

Schauen wir uns zunächst die JSON-Darstellung an:

{ "name":"John Smith", "age":26, "hobbies":[ "sports", "cooking" ], "manager":{ "name":"Jon Doe", "age":45, "hobbies":[ "fishing" ], "manager":null } }

Die JSON-Syntax ist etwas umständlich, da sie spezielle Syntax wie geschweifte Klammern {} und eckige Klammern [] verwendet , um Objekte und Arrays darzustellen.

Als nächstes wollen wir sehen, wie dieselbe Struktur in YAML aussehen würde:

name: John Smith age: 26 hobbies: - sports - cooking manager: name: Jon Doe age: 45 hobbies: - fishing manager:

Die Syntax von YAML sieht etwas freundlicher aus, da Leerzeichen verwendet werden, um Beziehungen zwischen Objekten zu kennzeichnen, und ' - ', um Array-Elemente darzustellen.

Wir können sehen, dass YAML, obwohl beide leicht lesbar sind, tendenziell besser lesbar ist.

Ein weiterer Bonuspunkt für YAML ist die Anzahl der Zeilen, die zur Darstellung derselben Informationen benötigt werden. YAML benötigt nur 11 Zeilen, während JSON 16 Zeilen benötigt.

3. Größe

Wir haben im vorherigen Abschnitt gesehen, dass YAML in weniger Zeilen als JSON dargestellt wird. Bedeutet dies jedoch, dass weniger Platz benötigt wird?

Stellen wir uns eine tief verschachtelte Struktur mit einem Elternteil und fünf Kindern vor, die als JSON dargestellt werden:

{ "child":{ "child":{ "child":{ "child":{ "child":{ "child":{ "child":null } } } } } } }

Die gleiche Struktur würde in YAML ähnlich aussehen:

child: child: child: child: child: child: child:

Auf den ersten Blick sieht es so aus, als würde JSON mehr Platz beanspruchen, aber in Wirklichkeit kümmert sich die JSON-Spezifikation nicht um Leerzeichen oder Zeilenumbrüche und kann wie folgt gekürzt werden:

{"child":{"child":{"child":{"child":{"child":{"child":{"child":null}}}}}}}

Wir können sehen, dass die zweite Form viel kürzer ist und nur 74 Bytes belegt, während das YAML-Format 97 Bytes benötigt.

4. YAML-Funktionen

Neben den grundlegenden Funktionen, die JSON bietet, bietet YAML zusätzliche Funktionen, wie wir im Folgenden sehen werden.

4.1. Bemerkungen

YAML ermöglicht Kommentare mithilfe von # , einer Funktion, die bei der Arbeit mit JSON-Dateien häufig gewünscht wird:

# This is a simple comment name: John

4.2. Mehrzeilige Saiten

Eine weitere Funktion, die in JSON fehlt, aber in YAML vorhanden ist, sind mehrzeilige Zeichenfolgen:

website: | line1 line2 line3

4.3. Aliase und Anker

Wir können einem bestimmten Element einfach einen Alias ​​zuweisen, indem wir & verwenden und ihn mit * verankern (referenzieren) :

httpPort: 80 httpsPort: &httpsPort 443 defaultPort: *httpsPort

5. Leistung

Aufgrund der einfachen Art der JSON-Spezifikation ist die Leistung beim Parsen / Serialisieren von Daten viel besser als bei YAML.

Wir werden einen einfachen Benchmark implementieren, um die Parsing-Geschwindigkeit von YAML und JSON mit JMH zu vergleichen.

Für den YAML-Benchmark verwenden wir die bekannte Snake-Yaml- Bibliothek, und für unseren JSON-Benchmark verwenden wir org-json :

@BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.SECONDS) @Measurement(batchSize = 10_000, iterations = 5) @Warmup(batchSize = 10_000, iterations = 5) @State(Scope.Thread) class Bench { static void main(String[] args) { org.openjdk.jmh.Main.main(args); } @State(Scope.Thread) static class YamlState { public Yaml yaml = new Yaml(); } @Benchmark Object benchmarkYaml(YamlState yamlState) { return yamlState.yaml.load("foo: bar"); } @Benchmark Object benchmarkJson(Blackhole blackhole) { return new JSONObject("{\"foo\": \"bar\"}"); } }

Wie wir vielleicht erwartet haben, ist JSON der Gewinner und ungefähr 30-mal schneller:

Benchmark Mode Cnt Score Error Units Main2.benchmarkJson thrpt 50 644.085 ± 9.962 ops/s Main2.benchmarkYaml thrpt 50 20.351 ± 0.312 ops/s

6. Verfügbarkeit der Bibliothek

JavaScript ist der Standard für das Web, was bedeutet, dass es fast unmöglich ist, eine Sprache zu finden, die JSON nicht vollständig unterstützt.

Auf der anderen Seite wird YAML weitgehend unterstützt, aber es ist kein Standard. Dies bedeutet, dass Bibliotheken für die meisten gängigen Programmiersprachen vorhanden sind, diese jedoch aufgrund ihrer Komplexität die Spezifikation möglicherweise nicht vollständig implementieren.

7. Was soll ich wählen?

Diese Frage ist möglicherweise schwer zu beantworten und in vielen Fällen subjektiv.

Wenn wir eine Reihe von REST-APIs für andere Front-End- oder Back-End-Anwendungen verfügbar machen müssen, sollten wir uns wahrscheinlich für JSON entscheiden, da dies de facto der Industriestandard ist.

Wenn wir eine Konfigurationsdatei erstellen müssen, die häufig von Menschen gelesen / aktualisiert wird, ist YAML möglicherweise eine gute Option.

Natürlich kann es auch Anwendungsfälle geben, in denen sowohl YAML als auch JSON gut passen, und dies ist nur eine Frage des Geschmacks.

8. Fazit

In diesem kurzen Artikel haben wir die Hauptunterschiede zwischen YAML und JSON kennengelernt und erfahren, welche Aspekte zu berücksichtigen sind, um eine fundierte Entscheidung darüber zu treffen, welchen wir wählen sollten.