====== JSON ======= **JSON** steht für **J**ava**S**cript **O**bject **N**otation 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 [[data:text:ini|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 [[http://www.json.org/|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: **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.