JSON
Die JavaScript Object Notation (JSON [Datenformat in einer einfach lesbaren Textform für den Datenaustausch zwischen Anwendungen. JSON ist von Programmiersprachen unabhängig. Parser und Generatoren existieren in den meisten verbreiteten Sprachen. ]) ist ein kompaktesJSON wurde ursprünglich 1997 von Douglas Crockford spezifiziert.[3] Derzeit (Stand Ende 2017) wird es durch zwei inhaltlich gleiche Standards spezifiziert – RFC 8259[1] sowie ECMA-404.[2] EinsatzgebieteJSON wird zur Übertragung und zum Speichern strukturierter Daten eingesetzt. Es dient als Datenformat bei der Datenübertragung (Serialisierung). Insbesondere bei Webanwendungen und mobilen Apps wird es in Verbindung mit JavaScript, Ajax oder WebSockets zum Übertragen von Daten zwischen dem Client und dem Server häufig genutzt. Datenstruktur und FormatdefinitionZeichencodierung und DatentypenDie Daten können beliebig verschachtelt werden, beispielsweise ist eine indizierte Liste (englisch „array“) von Objekten möglich, welche wiederum arrays oder Objekte enthalten. Als Zeichenkodierung benutzt JSON standardmäßig UTF-8. Auch UTF-16 und UTF-32 sind möglich. JSON kennt die folgenden Typen von Elementen.
Nicht signifikante Leerraum-Zeichen sind erlaubt, also Leerzeichen (Unicode U+0020), horizontale Tabs (U+0009), Zeilenumbrüche mittels LF und / oder CR (U+000D und U+000A).[4] Diese Zeichen werden außerhalb von Zeichenketten bei der Interpretation ignoriert. EinschränkungenIm Gegensatz zu JavaScript und vielen anderen Programmiersprachen erlaubt JSON für Zahlen nicht die in IEEE 754 definierten Sonderwerte für Unendlich und NaN.[3] Außerdem fehlen Wertetypen für zum Beispiel Datums- und Zeitwerte, reguläre Ausdrücke, Funktionsliterale und Fehlertypen.[3] Beim Serialisieren nach JSON können solche nicht abbildbaren Werte entweder durch JSON unterstützt ebenfalls keine Kommentare, die beim Einlesen der Daten ignoriert werden würden. Um diese Einschränkungen zu umgehen, erlauben viele JSON-Programmbibliotheken (optional) die Verletzung des JSON-Standards, womit beispielsweise Werte für Unendlich und NaN[6] unterstützt werden können oder wodurch Kommentare ignoriert werden, statt zu Fehlern zu führen[7]. BeispielEin Beispiel eines Kreditkartenkunden. {
"Herausgeber": "Xema",
"Nummer": "1234-5678-9012-3456",
"Deckung": 2e+6,
"Waehrung": "EURO",
"Inhaber":
{
"Name": "Mustermann",
"Vorname": "Max",
"Teilnahme am Bonusprogramm": true,
"Hobbys": ["Reiten", "Golfen", "Lesen"],
"Alter": 42,
"Kinder": [],
"Partner": null
}
}
JSON SchemaJSON Schema gibt ein JSON-basiertes Format an, um die Struktur von JSON-Daten für die Validierung, Dokumentation und Interaktionssteuerung zu definieren. Es enthält einen Vertrag für die JSON-Daten, die für eine bestimmte Anwendung erforderlich sind, und wie diese Daten geändert werden können. JSON Schema basiert auf den Konzepten von XML Schema (XSD), ist jedoch JSON-basiert. Wie in XSD können dieselben Serialisierungs- und Deserialisierungsprogramme sowohl für das Schema als auch für die Daten verwendet werden. Es ist selbstbeschreibend und in einem Internet-Entwurf der Internet Engineering Task Force festgelegt. Für verschiedene Programmiersprachen stehen mehrere Validatoren mit jeweils unterschiedlichen Konformitätsstufen zur Verfügung.[8] Beispiel{
"$schema": "http://json-schema.org/draft/2019-09/schema",
"title": "Politiker",
"type": "object",
"required": ["Vorname", "Nachname", "Geburtsdatum", "Nationalität"],
"properties":
{
"Vorname":
{
"type": "string"
},
"Nachname":
{
"type": "string"
},
"Geburtsdatum":
{
"type": "date"
},
"Nationalität":
{
"type": "string"
},
"Partei":
{
"type": "object",
"properties":
{
"Name":
{
"type": "string"
},
"Hauptsitz":
{
"type": "string"
},
"Gründungsdatum":
{
"type": "date"
},
"Gründungsort":
{
"type": "string"
}
}
},
"Amt":
{
"type": "string"
}
}
}
Das obige JSON Schema kann verwendet werden, um die Gültigkeit des folgenden Datenblocks zu testen: {
"Vorname": "Ronald",
"Nachname": "Reagan",
"Geburtsdatum": "1911-02-06",
"Nationalität": "US-amerikanisch",
"Partei":
{
"Name": "Republican Party",
"Hauptsitz": "Washington, D.C.",
"Gründungsdatum": "1854-03-20",
"Gründungsort": "Ripon"
},
"Amt": "US-Präsident"
}
Vergleich mit XMLSowohl JSON als auch XML beschreiben die Struktur eines Datensatzes. Der Datensatz kann weitere Datensätze enthalten, dadurch sind beliebig tief verschachtelte Strukturen möglich. In XML sind die einzelnen Knoten der Datenstruktur benannt, während die Knoten in JSON unbenannt sind. In XML können einfache Zeichenketten sowohl als Attribut eines Elements als auch als eigenständiges Element beschrieben sein, in JSON gibt es diese Unterscheidung nicht. Diese in den meisten Fällen irrelevante Flexibilität führt dazu, dass sich die Struktur von XML-Dokumenten häufig unnötigerweise unterscheidet. Sowohl für JSON als auch für XML gibt es Beschreibungssprachen, um weiter einzugrenzen, wie „gültige“ Dokumente aussehen, im Gegensatz zu „wohlgeformten“ Dokumenten. Die Syntax von JSON ist sehr viel einfacher gestaltet und erscheint daher oft lesbarer und insbesondere leichter schreibbar. In der Regel produziert JSON auch geringeren Overhead im Vergleich zu XML. Sowohl JSON als auch XML[9] müssen von einem speziellen Parser eingelesen werden. Traditionell ist jedes wohlgeformte JSON-Dokument ein gültiger JavaScript-Ausdruck, das sorglose Interpretieren von JSON-Dokumenten mit Sowohl JSON als auch XML sind nicht gut zum Repräsentieren von Binärdaten geeignet, da beide Datenformate als Grundelement zeichenbasiert sind und nicht bytebasiert. Zum Vergleich das oben genannte Beispiel in einer XML-Form: <Kreditkarte Herausgeber="Xema" Nummer="1234-5678-9012-3456" Deckung="2e+6" Waehrung="EURO">
<Inhaber Name="Mustermann" Vorname="Max" Teilnahme_am_Bonusprogramm="true" Alter="42" Partner="null">
<Hobbys>
<Hobby>Reiten</Hobby>
<Hobby>Golfen</Hobby>
<Hobby>Lesen</Hobby>
</Hobbys>
<Kinder />
</Inhaber>
</Kreditkarte>
Nach Entfernung der optionalen Leerzeichen ist das JSON-Objekt 226 Byte, das XML-Objekt 279 Byte groß – ein Zuwachs um 23 %. <Kreditkarte>
<Herausgeber>Xema</Herausgeber>
<Nummer>1234-5678-9012-3456</Nummer>
<Deckung>2e+6</Deckung>
<Waehrung>EURO</Waehrung>
<Inhaber>
<Name>Mustermann</Name>
<Vorname>Max</Vorname>
<Teilnahme_am_Bonusprogramm>true</Teilnahme_am_Bonusprogramm>
<Hobbys>
<Hobby>Reiten</Hobby>
<Hobby>Golfen</Hobby>
<Hobby>Lesen</Hobby>
</Hobbys>
<Alter>42</Alter>
<Kinder />
<Partner>null</Partner>
</Inhaber>
</Kreditkarte>
Dieses Objekt wäre mit Entfernung der Leerzeichen 361 Byte groß – ein Zuwachs um 60 % zum JSON-Objekt. JSONP (JSON mit Padding)Bei JSONP (JSON mit Padding) werden die JSON-Daten über ein JSONP wurde 2005 von Bob Ippolito vorgestellt[11] und wird jetzt von vielen Web-2.0-Anwendungen wie Dojo Toolkit, jQuery,[12] Google Web Toolkit Applications[13] und Web Services unterstützt. Für dieses Protokoll wurden Erweiterungen vorgeschlagen, die zusätzliche Eingabeparameter ermöglichen, wie z. B. JSONPP.[14] FunktionsweiseÜblicherweise erfolgen Ajax-Datenabfragen an Server über das XMLHttpRequest-Objekt eines Webbrowsers. Aufgrund der Same-Origin-Policy funktioniert das nicht, wenn die in einem Webbrowser angezeigte Webseite über dieses Objekt auf einen Server zuzugreifen versucht, der in einer anderen Domain als die angezeigte Webseite liegt. Das Problem kann durch JSONP umgangen werden. Im Um die JSON-Daten auf dem Client verarbeiten zu können, verpackt der Server diese als Parameter in eine JavaScript-Funktion, die im Webbrowser bereits definiert ist. Der Name dieser Funktion wird dem Server üblicherweise im Query-String der URL mitgeteilt, wobei das genaue Format oder der Name des Parameters nicht genormt ist. Beispiel: Im HTML-Code einer Webseite werden die JSONP-Daten wie folgt eingebunden: <script type="text/javascript"
src="https://example.com/getjson?jsonp=exampleCallback">
</script>
Der Server erzeugt daraufhin einen JavaScript-Codeschnipsel, in dem die eigentlichen Daten an die genannte Funktion übergeben werden: exampleCallback( {"name":"Jane Doe", "value":4711} ); Der Browser führt diesen Funktionsaufruf daraufhin aus, als ob er direkt in der HTML-Seite niedergeschrieben worden wäre, und kann so die JSON-Daten aus dem Aufruf verarbeiten. Üblicherweise ist für jeden JSONP-Aufruf ein eigenes Sicherheitsrisiken
Da das AlternativeMit Cross-Origin Resource Sharing (CORS) existiert ein vergleichbares Verfahren, das den Zugriff über Domaingrenzen hinweg ermöglicht, ohne jedoch der abgefragten Ressource die Möglichkeit einzuräumen, beliebigen JavaScript-Code auszuführen. Beide Verfahren erfordern die Unterstützung durch die entsprechende Ressource, wobei CORS einfacher zu implementieren ist. Gleichzeitig erlaubt CORS eine einfache Einschränkung seitens der Ressource, von welchen Datenquellen (englisch „origins“, das sind URLs, Domänen o. ä.) sie genutzt werden kann. CORS ist gegenüber JSONP meist zu bevorzugen, da CORS insgesamt einfacher und sicherer ist. Verwandte TechnikenJSON-basierte Formate
Alternative Formate
Binäre FormateBinäre JSON-Varianten gibt es mit BSON (Binary JSON),[26] verwendet u. a. von MongoDB, und mit JSONB, verwendet von PostgreSQL.[27] Einen ähnlichen Ansatz verfolgen Googles Protocol Buffers (protobuf), denen im Unterschied zu JSON bzw. BSON ein Schema zugrunde liegt.[28][29] Ebenfalls an JSON orientiert ist das schemalose und auf platzsparende Serialisierung und Prozessierungsgeschwindigkeit hin optimierte CBOR.[30] Vorgänger-FormateVor der Verbreitung von JSON war XML das bekannteste Datenserialisierungsformat. NeXTstep verwendete bereits einige Jahre früher, spätestens seit 1994, eine ähnliche Technik, um einfache Objektbäume zu laden oder zu speichern. Sie heißen dort Property Lists und sind bis heute in macOS in Verwendung. Diese erlauben ebenfalls die Speicherung von Werten der Typen Array, Dictionary, boolescher Wert, Binärdaten, Datum, Zahl und Zeichenketten.[31][32] Die Tool Command Language kennt Dictionaries (dict), die ebenfalls beliebig geschachtelte, benannte Strukturen enthalten können. Diese sind gleichfalls strukturierte Zeichenketten. Der Zusatzaufwand (englisch „overhead“) ist gegenüber JSON deutlich vermindert, weil keine Doppelpunkte oder Anführungsstriche benötigt werden. Eine klare Trennung zwischen Objektstrukturen (Eigenschaft/Wert) und Tabellen („arrays“, hier als Listen bezeichnet) gibt es allerdings nicht. Daher ist eine Überführung von JSON-Daten in ein dict immer eindeutig und leicht möglich, umgekehrt jedoch nicht. WeblinksCommons: JavaScript Object Notation – Sammlung von Bildern, Videos und Audiodateien
Einzelnachweise
|