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.
{ "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)
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.
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 können true
oder false
sein. Beide Schlüsselwörter tauchen im JSON-String genau so auf.
true
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 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!"
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]
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] }
Jetzt ist natürlich interessant, wie man JSON verwenden kann. Für die gängigen Programmiersprachen existieren JSON-Implementierungen.
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
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.