JSON

JSON steht für JavaScript Object Notation und ist ein Datenformat. Datenformate werden benötigt um die Kommunikation zwischen Systemen zu regeln. So kommunizieren beispielsweise in modernen Webanwendungen Browser und Webserver über JSON-Objekte. Nun gibt es verschiedene Datenformate mit unterschiedlichsten Vor- und Nachteilen. JSONs Stärken liegen in der einfachen Les- und Modifizierbarkeit.

Beispiel

{
   "Herausgeber": "Xema",
   "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
   }
}

Dieses Beispiel wurde so formatiert, dass es für den Menschen übersichtlich und gut lesbar ist. Prinzipiell ist dies aber nicht notwendig. Das folgende JSON-Objekt enthält exakt die gleichen Daten und unterscheidet sich für den Sender bzw. Empfänger nicht:

{ "Herausgeber": "Xema", "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 } }

JSON-Objekte sind für den Menschen einfach zu lesen, zu modifizieren und zu verstehen. Sie enthalten zwar keine konkreten Datentypen, geben jedoch darüber Aufschluss, um welche Art von Daten es sich handelt. Dies ist bei Datenformaten nicht selbstverständlich (siehe INI-Format)

Aufbau

Prinzipiell unterscheidet man bei JSON-Objekten: Nullwerte, Boolsche Werte, Zahlen, Zeichenketten, Arrays und Objekte. Dabei beziehe ich mich hier auf die Darstellung in serialisierten String des JSON-Objektes.

Auf json.org befinden sich Syntaxdiagramme, die den Aufbau zusätzlich erklären.

Nullwert

Der Nullwert wird von vielen gängigen Sprachen unterstützt. Im serialisierten JSON-String wird er durch null vertreten. Dies ist auch die gängige Entsprechung in vielen Programmiersprachen (wie C/C++, PHP, JavaScript usw.). Andere Sprachen verwenden None (Python) oder nil (für „not in list“, Pascal/Delphi).

null

Boolsche Werte

Boolsche Werte können true oder false sein. Beide Schlüsselwörter tauchen im JSON-String genau so auf.

true

Zahlen

Prinzipiell unterscheidet man zwischen ganzzahligen Werten (integer values) und Gleitkommazahlen (floating point number). Beide Zahlarten tauchen direkt in ihrer intuitiven Entsprechung im String auf. Dabei ist bei Gleitkommazahlen prinzipiell auch die Schreibweise der abgetrennten Zehnerpotenz 2e-4 für 2*10^-4 möglich.

-243.34234

Zeichenketten

Zeichenketten werden in JSON-Objekten in der Regel mittels UTF-8 kodiert. Prinzipiell sind aber auch andere Kodierungen möglich - je nach dem, was die verwendete JSON-Implementierung anbietet. Dabei werden Zeichen mittels \ escaped, da das Zeichen der Begrenzung einer Zeichenkette dient:

"Hallo \"meine\" Welt!"

Arrays

Da die Menge an Primitivdaten in der Regel für komplexere Anwendungen nicht ausreicht, können auch Arrays in JSON-Objekten gespeichert werden. Sie werden von [ bzw. ] begrenzt und enthalten weitere JSON-Daten mit , getrennt. Dabei darf die „Regel“, dass Arrays immer Werte des gleichen Typs enthalten, gebrochen werden.

[1, 2, "Hallo Welt", 4.73, false]

Objekte

Durch die Unterstützung von Objekten wird JSON sehr interessant: Mit Hilfe eines assoziativen Arrays lassen sich Schlüssel-Wert-Paare in JSON darstellen. Dabei sind Schlüssel in der Regel Zeichenketten. Die zugehörigen Werte repräsentieren weitere JSON-Daten.

{ "even": [0, 2, 4, 6, 8], "odd": [1, 3, 5, 7, 9] }

Verwendung

Jetzt ist natürlich interessant, wie man JSON verwenden kann. Für die gängigen Programmiersprachen existieren JSON-Implementierungen.

Python

Hinweis: Wie bereits erwähnt, wird null in Python durch None repräsentiert. Analog werden true und false mit großem Anfangsbuchstaben geschrieben.

# -*- coding: utf-8 -*-
 
# importiert das json-Modul
import json
 
# Daten mit dicts und lists erfassen
daten = dict()
daten["herausgeber"] = "Xema"
daten["Nummer"] = "1234-5678-9012-3456"
daten["Deckung"] = 2e+6
daten["Währung"] = "EURO"
inhaber = dict()
inhaber["Name"] = "Mustermann"
inhaber["Name"] = "Max"
inhaber["männlich"] = True
hobbys = list()
hobbys.append("Reiten")
hobbys.append("Golfen")
hobbys.append("Lesen")
inhaber["Hobbys"] = hobbys
inhaber["Alter"] = 42
inhaber["Kinder"] = list()
inhaber["Partner"] = None
daten["Inhaber"] = inhaber
 
# Daten serialisieren
zeichenkette = json.dumps(daten)
 
# ... irgendwann an anderer Stelle ... 
 
# Daten deserialisieren
erhalten = json.loads(zeichenkette)
 
# und ausgeben
print erhalten

Ausgabe:

{u'Inhaber': {u'Hobbys': [u'Reiten', u'Golfen', u'Lesen'], u'Name': u'Max',
u'm\xe4nnlich': True, u'Kinder': [], u'Partner': None, u'Alter': 42}, u'herausgeber': u'Xema',
u'Deckung': 2000000.0, u'Nummer': u'1234-5678-9012-3456', u'W\xe4hrung': u'EURO'}

Hinweis: Dabei konvertiert Python Umlaute wie ä durch \xe4 und maskiert alle Unicode-Zeichenketten mit einem u

PHP

Am oben aufgeführten Beispiel, ohne list()(Also auch Hobbys)ergibt sich folgender PHP-Code:

<?php
$daten["herausgeber"] = "Xema";
$daten["Nummer"] = "1234-5678-9012-3456";
$daten["Deckung"] = 2e+6;
$daten["Währung"] = "EURO";
$inhaber["Name"] = "Mustermann";
$inhaber["Name"] = "Max";
$inhaber["männlich"] = True;
$inhaber["Hobbys"][0] = "Reiten";
$inhaber["Hobbys"][1] = "Golfen";
$inhaber["Hobbys"][2] = "lesen";
$inhaber["Alter"] = 42;
$inhaber["Kinder"] = 0;
$inhaber["Partner"] = NULL;
$daten["Inhaber"] = $inhaber;
echo json_encode($daten);
echo json_encode($inhaber);
?>

Ausgabe:

{"herausgeber":"Xema","Nummer":"1234-5678-9012-3456","Deckung":2000000,
"W\u00e4hrung":"EURO","Inhaber":{"Name":"Max","m\u00e4nnlich":true,"Hobbys":
["Reiten","Golfen","lesen"],"Alter":42,"Kinder":0,"Partner":null}}{"Name":"Max",
"m\u00e4nnlich":true,"Hobbys":
["Reiten","Golfen","lesen"],"Alter":42,"Kinder":0,"Partner":null}

Hinweis: Genau wie in Python, werden auch Umlaute in PHP zu Unicode-Zeichen konvertiert.