Was ist JSON und wofür wird es verwendet?
Bei JSON (JavaScript Object Notation) handelt es sich um ein Datenformat, welches zur Speicherung und zum Austausch von Daten in Textform verwendet wird. Da das Format über einen sehr einfachen und kompakten Aufbau verfügt und zudem textbasiert ist, kann es somit auch von Menschen ohne weiteres direkt gelesen werden.
In den letzten Jahren hat die Beliebtheit von JSON, auch gerade im Gegensatz zu anderen Formaten, wie z. B. XML, immer weiter zugenommen, da das Format einfacher zu verwalten ist und gleichzeitig aber auch übersichtlichere Möglichkeiten zur Darstellung von Daten zur Verfügung stellt. Dies hat auch dazu geführt, dass in vielen Programmiersprachen bereits fertige Funktionen zum Lesen und Schreiben von JSON-Daten zur Verfügung stehen.
In den nächsten Abschnitten gehen wir nun zunächst genauer auf den Aufbau ein, vergleichen dann das Format mit XML und zeigen zum Schluss wie JSON in JavaScript und PHP verarbeitet werden kann.
Syntax und Aufbau von JSON
Um Daten in JSON darstellen zu können, müssen wir zunächst auf die verschiedenen Datentypen eingehen. Der Datentyp legt dabei, wie in einer Programmiersprache, fest, welche Werte für ein bestimmtes Datum (bzw. in Bezug auf eine Programmiersprache für eine Variable) zulässig sind. In JSON ist zunächst zwischen folgenden primitiven Datentypen zu unterscheiden:
- Wahrheitswert: hier stehen die beiden Werte
true
(wahr) undfalse
(unwahr) zur Verfügung. - Zahl: stellt einen beliebigen nummerischen Wert dar. Bei dem Wert kann es sich sowohl um eine Festpunktzahl mit oder ohne Vorzeichen (z. B.
123
oder-456
) als auch um eine Gleitkommazahl (z. B.123.45
) handeln. Auch die Angabe einer Zahl mit einem Exponenten ist möglich (z. B.1.23456e-4
). - Zeichenkette: stellt eine Folge einer beliebigen Anzahl an Zeichen dar. Die Folge an Zeichen muss dabei zwischen doppelten Anführungszeichen
"
notiert werden (z. B."Hallo"
). Die Verwendung von leeren Zeichenketten ist erlaubt.
Des Weiteren stehen noch folgende erweiterte Datentypen zur Verfügung:
- Array: ist eine Liste mit einer beliebigen Anzahl an Werten. Die einzelnen Werte des Arrays können dabei sowohl vom gleichen als auch von einem unterschiedlichen Typ sein, werden durch das einfache Komma
,
getrennt und innerhalb der eckigen Klammern[
und]
notiert (z. B.[ 1, 2, 3 ]
). Die Verwendung von leeren Arrays ist erlaubt. - Objekt: ist eine Liste mit einer beliebigen Anzahl an Eigenschaften. Dabei besteht jede Eigenschaft aus einer Zeichenkette, die einen eindeutigen Schlüssel definiert, und einem Wert, der einen beliebigen Typ haben kann. Der Schlüssel und Wert wird mit dem Doppelpunkt
:
voneinander getrennt, wohingegen die Eigenschaften mit einem Komma,
getrennt werden (z. B."jahr": 2021, "monat": "März", "tag": 27
). Die Angabe der Eigenschaften eines Objekts werden in den geschweiften Klammern{
und}
zusammengefasst. Die Verwendung von leeren Objekten ist erlaubt.
Ein weiterer spezieller Datentyp bzw. Wert ist null
. Mit diesem Wert kann ausgedrückt werden, dass ein Wert oder eine Eigenschaft nicht verfügbar ist. Der Wert null
ist dabei nicht mit dem Wert 0
zu verwechseln, da der Wert 0
ein gültiger Wert des Datentyps Zahl darstellt.
Durch die Verschachtelung von Arrays und Objekten, die eine beliebige Tiefe annehmen können, ist es somit mit JSON relativ einfach möglich, auch komplexe Daten übersichtlich darzustellen. Als Wurzelknoten, also dem Knoten der obersten Ebene, zur Darstellung von JSON-Daten, wird meistens ein Objekt oder Array verwendet. Theoretisch ist aber auch die Notation eines einzelnen Werts eines primitiven Datentyps bereits als gültige JSON-Daten zu betrachten.
Wichtig: Eine Notation von JSON-Daten darf ausschließlich aus der Angabe von Daten bestehen. Zur besseren Lesbarkeit dürfen zwischen einzelnen Eigenschaften oder Elementen Leerraumzeichen (also Zeilenumbrüche, Tabs und Leerzeichen) notiert werden. Eine Unterstützung für Kommentare existiert nicht.
Nun wollen wir uns aber auch mal einem vollständigen Beispiel widmen. Die folgenden JSON-Daten stellen einen Datensatz für eine Person dar, wie sie z. B. in einem Adressbuch hinterlegt sein könnte:
{ "Favorit": true, "Vorname": "Max", "Nachname": "Mustermann", "Straße": "Musterstraße", "Hausnummer": "1", "Adresszusatz": null, "Postleitzahl": 12345, "Ort": "Musterstadt", "Land": "Deutschland", "Telefon": "01234 / 567890", "EMail": "max@mustermann.de", "Geburtstag": "01.01.1974", "Kinder": [ { "Name": "Maria", "Geburtstag": "13.05.1997" }, { "Name": "Moritz", "Geburtstag": "04.11.2001" } ] }
Vergleich mit XML
Das Beispiel von oben im JSON-Format lässt sich auch im XML-Format darstellen. Dies könnte dann wie folgt aussehen:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <kontakt> <favorit>ja</favorit> <vorname>Max</vorname> <nachname>Mustermann</nachname> <strasse>Musterstraße</strasse> <hausnummer>1</hausnummer> <adresszusatz /> <postleitzahl>12345</postleitzahl> <ort>Musterstadt</ort> <land>Deutschland</land> <telefon>01234 / 567890</telefon> <email>max@mustermann.de</email> <geburtstag>01.01.1974</geburtstag> <kinder> <kind> <name>Maria</name> <geburtstag>13.05.1997</geburtstag> </kind> <kind> <name>Moritz</name> <geburtstag>04.11.2001</geburtstag> </kind> </kinder> </kontakt>
Wenn man die beiden Formate nun miteinander vergleicht, können folgende Unterschiede festgestellt werden:
- die Darstellung im JSON-Format ist kürzer als im XML-Format
- im XML-Format ist nicht erkennbar, welchen Datentyp ein bestimmtes Element besitzt, da es bei XML keine Datentypen gibt
- im Beispiel mit dem XML-Format wurden keine Attribute verwendet, da es eine solche Technik in JSON nicht gibt
Grundsätzlich gilt zu ergänzen, dass ein direkter Vergleich von JSON und XML nicht möglich ist, da es sich um zwei Formate handelt, die einen unterschiedlichen Ansatz zur Darstellung von Daten besitzen. Welches Format besser geeignet ist, hängt vom einzelnen Verwendungszweck ab. Aus heutiger Sicht ist im Regelfall aber das JSON-Format auf Grund seiner besseren Lesbarkeit, kürzeren Darstellung und weiten Verbreitung bzw. Unterstützung zu bevorzugen.
Verwendung von JSON in JavaScript
Da JSON von JavaScript abgeleitet ist, können JavaScript-Variablen vom Typ Boolean
, Number
, String
, Array
und Object
problemlos in JSON konvertiert werden. Hierzu wird die Funktion JSON.stringify()
verwendet:
var person = { name: "Max Mustermann", alter: 47 }; var json = JSON.stringify(person); alert(json); // Ausgabe: {"name":"Max Mustermann","alter":47}
Hinweis: Die Werte NaN
, Infinity
und -Infinity
des JavaScript-Datentyps Number
stehen in JSON nicht direkt zur Verfügung und werden daher in null
konvertiert.
Die Konvertierung von JSON in eine JavaScript-Variable ist ebenfalls problemlos möglich. Für diese Konvertierung wird die Funktion JSON.parse()
verwendet:
var json = '{"name":"Max Mustermann","alter":47}'; var person = JSON.parse(json); alert(person.name + " ist " + person.alter + " Jahre alt!"); // Ausgabe: Max Mustermann ist 47 Jahre alt!
Verwendung von JSON in PHP
Auch in PHP gibt es Funktionen zur Konvertierung von JSON-Daten. Um eine PHP-Variable in JSON zu konvertieren, wird die Funktion json_encode()
verwendet. Da es in PHP keine anonymen Objekte (also Objekte ohne Klasse), wie sie in JavaScript existieren, gibt, wird für die Konvertierung einer PHP-Variablen in den JSON-Datentyp Objekt im Regelfall ein assoziatives Array verwendet. Das Beispiel von oben mit JavaScript lässt sich wie folgt in PHP darstellen:
<?php $person = array( "name" => "Max Mustermann", "alter" => 47 ); $json = json_encode($person); echo $json; // Ausgabe: {"name":"Max Mustermann","alter":47} ?>
Mit der Funktion json_decode()
ist es in PHP möglich, JSON-Daten wieder zurück in eine PHP-Variable zu konvertieren. Hierbei ist zu beachten, dass der JSON-Datentyp Objekt hierbei auch tatsächlich in ein PHP-Objekt konvertiert wird. Das zu JavaScript äquivalente Beispiel sieht wie folgt aus:
<?php $json = '{"name":"Max Mustermann","alter":47}'; $person = json_decode($json); echo $person->name.' ist '.$person->alter.' Jahre alt!'; // Ausgabe: Max Mustermann ist 47 Jahre alt! ?>