JSON, XML und YAML im Vergleich

Kaveh KeshavarziThomas BayerVon: Kaveh Keshavarzi , Thomas Bayer
Datum: 06.07.2011

Für Web APIs und Konfigurationen wird XML zunehmend von einfacheren Formaten wie JSON und YAML verdrängt. So hat Twitter seine Unterstützung für XML in ihren Streaming APIs eingestellt. Dieser Artikel vergleicht JSON, YAML und XML und zeigt die Stärken der Formate für bestimmte Anwendungsgebiete auf.

JSON

JavaScript Object Notation ist ein Format für die Serialisierung von Objekten. Spezifiziert wurde es von Douglas Crockford. Für die Notation wurde die Syntax von JavaScript verwendet. Somit ist ein JSON Dokument gleichzeitig ein ausführbares JavaScript.

Die übliche Trennung von Daten (z. B. XML Dokumente) und Code (z. B. Java) wird damit vermieden. Bereits die Sprache Lisp aus den Pioniertagen der EDV machte keinen Unterschied zwischen Code und Daten. Besonders beliebt ist der Einsatz von JSON für das asynchrone Übertragen von Daten zwischen Servern und Web Seiten. JSON hat mittlerweile XML als AJAX Format fast verdrängt.

Dank der einfachen Schreibweise sind JSON Dokumente auch für Menschen leicht verständlich. Listing 1 zeigt ein Beispiel für eine Bestellung. Verwendet wurde hier die Schreibweise für ein JavaScript Objekt. Das Objekt besitzt die vier Eigenschaften id, date, customer und items. Id und customer sind von Typ Number. Die Eigenschaft date ist vom Typ String. Einen speziellen Datentyp für ein Datum gibt es bei JavaScript nicht. Items enthält eine Liste mit zwei Objekten.

{
    "id": 731,
    "date": "16th of May 2011",
    "customer": 17,
    "items" : [
        {
            "quantity": 5,
            "description": "Oolong",
            "price": 5.98,
            "in-stock": true 
        },
        {
            "quantity": 2,
            "description": "Assam",
            "price": 2.95,
            "in-stock": false 
        } 
    ]
}
      
Listing 1: Beispiel einer Bestellung in JSON

Für dieselbe Bestellung finden Sie in den folgenden Abschnitten entsprechende YAML und XML Dokumente.

Die Stärken von JSON liegen in einer übersichtlichen Notation, einem geringen Overhead und der guten Unterstützung durch eine Vielzahl von Programmiersprachen.

YAML

YAML ist die Kurzform von „YAML Ain’t Markup Language“. Bekannt wurde YAML als ein Format für die Konfiguration von Ruby on Rails. Die Sprache für den Datenaustausch ist in Gegensatz zu XML leicht zu lesen und zu editieren. Dies wurde durch einen Verzicht auf Klammern, Anführungszeichen und Tags erreicht. Für die Darstellung von hierarchischen Strukturen verwendet YAML Einrückungen. Dadurch wird die Bestellung in Listing 2 noch etwas kompakter und übersichtlicher als die Bestellung im JSON Format.

---
id: 731
date: 16th of May 2011
customer: 17
items:
- quantity: 5
  description: Oolong
  price: 5.98
  in-stock: true
	
- quantity: 2
  description: Assam
  price: 2.95
  in-stock: false
      
Listing 2: Beispiel einer Bestellung in YAML

Im Beispiel finden wir eine Liste der Positionen (items). Eine Liste wird wie bei einer Textverarbeitung durch die Voranstellung eines Aufzählungszeichens gebildet.

Da YAML ein Superset von JSON ist, können Klammern optional verwendet werden um JSON Kompatibilität zu erreichen.

YAML ist zeilenorientiert und kann daher auch von Werkzeugen wie awk oder grep verarbeitet werden.

Darüber hinaus bietet YAML einige Features, die in JSON und XML nicht zu finden sind. Zum Beispiel wird in Listing 3 eine Map cities1 mit Haupstädten definiert. Die Map cities2 erweitert die erste Map um Rom und korrigiert den Eintrag für Germany.

- cities1: &capitals
  Germany: Bonn
  France: Paris

- cities2: 
  <<: *capitals
  Germany: Berlin
  Italy: Rom
      
Listing 3: Vermeidung von Redundanz mit relationalen Daten

Ferner unterstützt YAML Datentypen und Type Casting.

XML

Seit der Veröffentlichung der XML 1.0 Spezifikation hat sich XML stark verbreitet. Es gibt tausende Markup Sprachen, die auf XML basieren. XML ist in fast alle Anwendungsbereiche vorgedrungen. Es gibt jedoch einen Bereich, der nach wie vor, heftigen Wiederstand gegen die Dominanz von XML leistet. Obwohl XML entwickelt wurde, um Probleme im Web Design zu lösen, gibt es dort eine starke Abneigung. Beispielsweise filtern Firefox und IE Namespace Deklarationen in XML Dokumenten einfach aus, anstatt sie anzuzeigen.

Listing 4 zeigt die von oben bereits bekannte Bestellung im XML Format.

<order>
  <id>731</id>
  <date>16th of May 2011</date>
  <customer>17</customer>
  <items>
    <item>
      <quantity>5</quantity>
      <description>Oolong</description>
      <price>5.98</price>
      <in-stock>true</in-stock>
    </item>
    <item>
      <quantity>2</quantity>
      <description>Assam</description>
      <price>2.95</price>
      <in-stock>false</in-stock>
    </item>
  </items>
</order>
      
Listing 4: Beispiel einer Bestellung in XML

Die Bestellung im XML Format hat einen größeren Overhead und ist unübersichtlicher als das JSON oder YAML Dokument. Würden wir unseren Vergleich dabei belassen, so wäre XML der klare Verlierer. XML ist aber im Gegensatz zu JSON und YAML eine Markupsprache. XML kann daher für mehr als nur für das Serialisieren von Objekten eingesetzt werden.

In Listing 5 wurde die gleiche Bestellung mit weiteren XML Features versehen. Im Dokument werden jetzt Elemente von weiteren XML Sprachen verwendet. Das id Element zeigt über XLink auf eine REST Resource, über die Repräsentationen der Bestellung angefordert werden können. Die Adresse wurde eingebunden und die Beschreibung der zweiten Position enthält jetzt HTML Markup.

Das kurze Beispiel verdeutlicht gleichzeitig wie grauenhaft XML Dokumente werden können. Würde man JSON oder YAML um Namensräume erweitern, würden diese wahrscheinlich genauso unübersichtlich werden.

<order xmlns="http://predic8.com/order/V1/" 
  xmlns:html="http://www.w3.org/1999/xhtml">
  <id xmlns:xlink="http://www.w3.org/1999/xlink"
	 xlink:type="simple" 
	 xlink:href="http://server/order/731">731</id>
  <date>16th of May 2011</date>
  <customer>17</customer>
  <basic:address xmlns:basic="http://basic-address/de/">
    <basic:city>Bonn</basic:city>
    <basic:street>Moltkestr. 40</basic:street>
    <basic:zip>53173</basic:zip>
  </basic:address>
  <items>
    <item>
      <quantity>5</quantity>
      <description>Oolong</description>
      <price>5.98</price>
      <in-stock>true</in-stock>
    </item>
    <item>
      <quantity>2</quantity>
      <description><html:b>Assam</html:b> Black Tee</description>
      <price>2.95</price>
      <in-stock>false</in-stock>
    </item>
  </items>
</order>
      
Listing 5: Beispiel einer Bestellung in XML mit eingebettetem XLink und HTML

Die Struktur von XML Dokumenten kann mit XML Schema beschrieben werden. Listing 6 zeigt den Auszug eines Schemas mit der Definition eines Typs für eine Position einer Bestellung.

  <complexType name="itemType">
    <sequence>
      <element name="quantity" type="int" />
      <element name="description">
	   <complexType mixed="true">
	     <any namespace="##any"/>	
	   </complexType>
	 </element>
      <element name="price" type="float" />
      <element name="in-stock" type="boolean" />
    </sequence>
  </complexType>
      
Listing 6: Das Schema eines Items

Die Formatbeschreibung mit XML Schema bietet zahlreiche Möglichkeiten:

  • XML Editoren können mit Hilfe des Schemas Fehler erkennen und anzeigen oder Autovervollständigung anbieten
  • Aus XML Schema kann Code für die Serialisierung von XML Dokumenten erzeugt werden
  • Das Schema kann als Dokumentation dienen
  • XML Dokumente können gegen das Schema validiert werden.
Außer XML Schema gibt es in der XML Welt eine Vielzahl von Standards und Werkzeugen für die Erzeugung und Verarbeitung von XML.

Die folgende Liste enthält nur einige wenige Beispiele:

  • Abfragen mit XPath und XQuery
  • Transformation mit XSLT
  • Ablage in einer XML Datenbank
  • Routing über einen ESB

Weltoffenheit

Durch die Verwendung von Namespaces können Elemente und Attribute in XML weltweit eindeutig benannt werden. Ein XML Dokument kann losgelöst von einer Anwendung interpretiert werden. Bei JSON und YAML Dokumenten bekommt der Inhalt erst durch die Anwendung, die das Dokument einliest, einen Sinn.

Durch Die Namespaces bekommen XML Dokumente einen Kontext, in dessen Rahmen sie interpretiert werden können. XML Verfechter werfen daher anderen Formaten Provinzialität vor.

Web Unterstützung

Mit XML lässt sich die REST Idee, dass alles eine Resource ist, leicht umsetzen.

Über ein XLink Attribute oder ein umschließendes Element kann jeder Information ein Verweis auf eine Resource hinzugefügt werden. Mit JSON oder YAML geht das nicht, obwohl diese vorgeben,“Web“ Sprachen zu sein.

Fazit

JSON hat die XML's Alleinherrschaft in Frage gestellt und gezeigt, dass es für spezielle Aufgaben wie z. B. die Serialisierung von Objekten eine schlankere Alternative gibt. JSON und YAML zeigen auch, dass es in Sachen Lesbarkeit besser geht. XML punktet nach wie vor durch seine Vielseitigkeit, Toolunterstützung sowie durch die Vielzahl der Standards, die auf XML aufbauen oder mit XML kombinierbar sind.

Quellen

Einführung in JSON
YAML Ain’t Markup Language (YAML™) Version 1.2
Extensible Markup Language (XML) 1.0 (Fifth Edition)