JavaScript Object Notation
Die JavaScript Object Notation, kurz JSON (IPA: {{IPA|/ˈdʒeɪsʌn/}}), ist ein kompaktes Datenformat in für Mensch und Maschine einfach lesbarer Textform zum Zweck des Datenaustauschs zwischen Anwendungen. Jedes gültige JSON-Dokument soll ein gültiges JavaScript sein und per eval() interpretiert werden können. Aufgrund subtiler Abweichungen in der Menge der erlaubten Unicode-Zeichen ist es jedoch möglich, JSON-Objekte zu generieren, die von einem normkonformen JavaScript-Interpreter nicht akzeptiert werdenhttp://timelessrepo.com/json-isnt-a-javascript-subset. Davon abgesehen ist JSON aber unabhängig von der Programmiersprache. Parser existieren in praktisch allen verbreiteten Sprachen. JSON wurde von Douglas Crockford spezifiziert.
Einsatzgebiete
- In Verbindung mit JavaScript on Demand (JOD), Ajax oder WebSockets zur Übertragung von Daten zwischen Client und Server.
* Ersatz für XML in Bereichen, wo Ressourcen (Speicherplatz, CPU-Leistung) sparsam eingesetzt werden sollen. Dies gilt im Besonderen bei der Entwicklung von desktopähnlichen Webanwendungen.
Datenstruktur und Formatdefinition
Die Daten können beliebig verschachtelt werden, beispielsweise ist ein Array von Objekten möglich. Als Zeichenkodierung benutzt JSON standardmäßig UTF-8; UTF-16 und UTF-32 sind auch möglich.
JSON kennt folgende Datentypen:
; Nullwert
: wird durch das Schlüsselwortnulldargestellt.
; boolescher Wert
: wird durch die Schlüsselwörtertrueundfalsedargestellt. Dies sind keine Zeichenketten. Sie werden daher, wienull, nicht in Anführungszeichen gesetzt.
; Zahl
: ist eine Folge der Ziffern0–9. Diese Folge kann durch ein negatives Vorzeichen-eingeleitet und einen Dezimalpunkt.unterbrochen sein. Die Zahl kann durch die Angabe eines ExponenteneoderEergänzt werden, dem ein Vorzeichen+oder-und eine Folge der Ziffern0–9folgt.
; Zeichenkette
: beginnt und endet mit doppelten geraden Anführungszeichen ("). Sie kann Unicode-Zeichen und Escape-Sequenzen enthalten.
; Array
: beginnt mit
; Objekt[und endet mit]. Es enthält eine durch Kommata geteilte, geordnete Liste von Werten, gleichen oder verschiedenen Typs. Leere Arrays sind zulässig.
: beginnt mit{und endet mit}. Es enthält eine durch Kommata geteilte, ungeordnete Liste von Eigenschaften. Objekte ohne Eigenschaften ("leere Objekte") sind zulässig.
:; Eigenschaft
:: besteht aus einem Schlüssel und einem Wert, getrennt durch einen Doppelpunkt (Schlüssel:Wert). Die Schlüssel aller Eigenschaften in einem Objekt müssen eindeutig, also paarweise verschieden sein.
::* der Schlüssel ist eine Zeichenkette.
::* der Wert ist ein Objekt, ein Array, eine Zeichenkette, eine Zahl oder einer der Ausdrücke
true,falseodernull.Leerraum-Zeichen sind beliebig verwendbar.
Beispiel
{
"Nummer": "1234-5678-9012-3456",
"Deckung": 2e+6,
"Währung": "EURO",
"Inhaber": {
"Name": "Mustermann",
"Vorname": "Max",
"männlich": true,
"Hobbys": [ "Reiten", "Golfen", "Lesen" ],
"Alter": 42,
"Kinder": [],
"Partner": null
}
}
Unterschied zu XML
Die Syntax von JSON ist einfacher gestaltet und erscheint daher oft lesbarer und insbesondere leichter schreibbar. In der Regel reduziert JSON auch den Overhead im Vergleich zu XML.
In XML könnten viele Werte und Eigenschaften potenziell sowohl als Attribute als auch Kindknoten beschrieben werden, was zu Problemen führen kann, wenn dies nicht durch sehr strikte Spezifizierung verhindert wird. In JSON kann dieses Problem nicht auftreten.
JSON-Daten sind im Gegensatz zu XML-Daten typisiert, wobei nur einige grundlegende Typen unterstützt werden. Eine Stärke von JSON ist die Tatsache, dass es sich bei der Definition selbst, bis auf wenige Einschränkungenhttp://timelessrepo.com/json-isnt-a-javascript-subset um valides JavaScript handelt. Damit lässt sich eine JSON-Definition in JavaScript direkt mit der eval()-Funktion in ein JavaScript-Objekt umsetzen. Bei Daten aus potentiell unsicheren Quellen sollte aber unbedingt ein Parser verwendet werden, da eval auch ggf. schädliche Programmanweisungen ausführt.
XML ist eine Auszeichnungssprache und somit vielseitiger einsetzbar als JSON, welches ein Datenaustauschformat ist. XML ist weiter verbreitet, wird jedoch von JSON aufgrund seiner Einfachheit dort zurückgedrängt, wo keine komplizierten Auszeichnungen notwendig sind. Beide Formate sind nicht gut zum Repräsentieren von Binärdatenmengen geeignet, da beide keinen Binärdatentyp unterstützen.
Zum Vergleich das oben genannte Beispiel in einer XML-Form:Nummer="1234-5678-9012-3456"
Deckung="2e+6"
Waehrung="EURO">
Vorname="Max"
maennlich="true"
Alter="42"
Partner="null">
Dieses Objekt wäre mit Entfernung der Leerzeichen 362 Byte groß.
{{Anker|JSONP}} JSONP (JSON mit Padding)
JSONP ermöglicht die Übertragung von (JSON-)Daten über Domaingrenzen.
Ü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.
Die Grundidee: JSON-Abfragen über Script-Tags
Im src-Attribut eines <script>-Elements ist es möglich, beliebige URLs anzugeben. Für dieses Attribut greift die Same-Origin-Policy nicht. Es ist also möglich, eine URL in einer anderen Domain anzugeben, die beispielsweise JSON-Daten zurück gibt. Dieses Script hätte aber keinen Effekt.
Padding
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 über einen Query String der URL mitgeteilt; beispielsweise:
src="http://example.com/getjson?jsonp=Rueckruf">
Script-Element-Injektion (Einfügen von Programmcode)
Für jeden JSONP-Aufruf ist ein eigenes <script>-Element erforderlich. Daher muss der Browser für jeden Aufruf ein neues <script>-Element in den DOM-Knotenbaum der aktuellen Webseite einfügen.
Sicherheitsrisiken
<script>-Elemente ermöglichen es einem Server, beliebige Inhalte (nicht nur JSON-Objekte) an den Webbrowser zu übermitteln. Dies kann dazu führen, dass ein bösartiger Web-Service über die zurückgesendeten Daten private Informationen im Webbrowser ausspäht oder in seinem Sinne verändert.
Cross-Site Request Forgery
Da das <script>-Element die Same-Origin-Policy nicht beachtet, kann eine bösartige Webseite JSONP-Daten anfordern und auswerten, die nicht für sie bestimmt sind{{cite web |url=http://jeremiahgrossman.blogspot.com/2006/01/advanced-web-attack-techniques-using.html |title=Advanced Web Attack Techniques using GMail |first=Jeremiah |last=Grossman |date=27. Januar 2006 |accessdate=23. Januar 2011}}. Das Problem tritt dann auf, wenn sensible Daten vor Dritten geschützt werden sollen.
Geschichte
JSONP wurde 2005 von Bob Ippolito vorgestellt{{cite web |url=http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/ |work=from __future__ import * |title=Remote JSON - JSONP |publisher=Bob.pythonmac.org |date=5. Dezember 2005|accessdate= 23.Januar 2011 }} und wird jetzt von vielen Web-2.0-Anwendungen wie Dojo Toolkit, jQuery{{cite web |url=http://api.jquery.com/jQuery.getJSON/ | title=jQuery API| accessdate=23. Januar 2011 }}, Google Web Toolkit Applications{{cite web |url=http://www.gwtapps.com/?p=42 |title=GWT Tutorial: How to Read Web Services Client-Side with JSONP |date=February 6, 2008 |work=Google Web Toolkit Applications |accessdate=23.Januar 2011}} und Web Services unterstützt. Für dieses Protokoll wurden Erweiterungen vorgeschlagen, die zusätzliche Eingabeparameter ermöglichen, wie z. B. JSONPP{{cite web |first=Jonas |last=Almeida |url=http://sites.google.com/a/s3db.org/s3db/documentation/mis/json-jsonp-jsonpp |title=JSON, JSONP, JSONPP? |publisher=S3DB |date=11. Juni 2008 |accessdate=23. Januar 2011}}.
Cross-Origin Resource Sharing
Mit Cross-Origin Resource Sharing (CORS) existiert eine vergleichbare Technologie, die den Zugriff über Domaingrenzen hinweg ermöglicht.
Ähnliche Techniken
Mit YAML existiert eine ähnliche Technik. Allerdings ist YAML eine Markup-Sprache zur reinen Serialisierung und in keiner Sprache gültiger Code. Aber auch hierbei handelt es sich um einen „Document Object Model“-Dateityp. YAML kann als Obermenge von JSON angesehen werden, da jedes JSON-Dokument auch ein valides YAML-Dokument ist.[http://yaml.org/spec/1.2/spec.html#id2759572 YAML Ain’t Markup Language (YAML™) Version 1.2]
Mit BISON (Binary Interchange Standard and Object Notation) wurde auch ein kompakteres, weil binäres JSON eingeführt.[http://kaijaeger.com/downloads/bison/BISON_specification_1_0.pdf BISON Specification Version 1.0]
NextSTEP bzw. MacOS X kennt eine ähnliche Technik, um einfache Objektbäume zu laden oder zu speichern, sie heißen dort „Property Lists“. Diese erlauben ebenfalls die Speicherung von Werten der Typen Array, Dictionary, boolescher Wert, Binärdaten (Base64-kodiert), Datum, Zahl und Zeichenketten, entweder als XML, als kompaktes Binärformat oder als ASCII bzw. UTF-8.{{internetquelle |Autor= developer.apple.com|url=http://developer.apple.com/documentation/Cocoa/Conceptual/PropertyLists/Introduction/Introduction.html |titel=Introduction to Property Lists |sprache =en|zugriff=2011-11-06}}
Symbolische Ausdrücke in Lisp-Notation beschreiben sowohl Daten als auch Code.
BERT ist ein Binärformat, das auf Erlang basiert, und hat somit eine ähnliche Herkunft wie JSON. Ähnlich zu JSON gibt es auch ein auf BERT basierendes RPC-Format.http://bert-rpc.org/
Weblinks
* [http://json.org/json-de.html json.org] deutsche Einführung auf der offiziellen JSON-Seite (weitere Sprachen verfügbar)* [http://www.webmasterpro.de/coding/article/json-als-xml-alternative.html JSON als XML-Alternative] Kurze Einführung
* [http://www.developer.com/lang/jscript/article.php/3596836 Speeding Up AJAX with JSON] Einführung in JSON, bei der die Unterschiede zu XML herausgearbeitet werden (Englisch)
* RFC 4627 application/json, ein zusätzlicher MIME-Typ für JSON, zur Unterscheidung von JavaScript
* [http://jsonformatter.curiousconcept.com/ JSON Formatter & Validator] Online Formatter und Validator (Englisch)
Einzelnachweise
Json
ar:جسون
ca:JSON
cs:JavaScript Object Notation
JSON
es:JSON
et:JSON
fa:جیسون
fi:JSON
JavaScript Object Notation
gl:JSON
he:JSON
hu:JSON
hy:JSON
id:JSON
it:JSON
ja:JavaScript Object Notation
ko:JSON
lv:JSON
ml:ജെസൺ
nl:JSON
no:JSON
pl:JSON
pt:JSON
ro:JSON
ru:JSON
simple:JSON
sv:JSON
ta:யேசண்
th:เจซัน
tr:JSON
uk:JSON
vi:JavaScript Object Notation
zh:JSON
Text und Bilder dieses Beitrags stammen aus dem Artikel JavaScript Object Notation der freien Enzyklopädie Wikipedia und stehen unter der GNU Free Documentation License. Die Liste der Autoren ist in der Wikipedia unter dieser Seite verfügbar, der Original-Artikel lässt sich hier bearbeiten.