Skip to main content

JSON-Exkurs

Die Abkürzung JSON steht für JavaScript Object Notation und bezeichnet eine Schreibweise zum strukturierten Speichern von Objekte mit Daten. Die Syntax erinnert sehr an das namensgebende JavaScript, aber das JSON-Format hat sich mittlerweile auch bei anderen Programmiersprachen durchgesetzt. Es ist neben XML eine der alltagstauglichen Schnittstellen zum Datenaustausch zwischen unterschiedlichen Programmen, um Daten aus Onlinedatenbanken zur Verfügugung zu stellen (WebAPI) oder zum Zwischenspeichern und Absichern von Nutzereingaben und anderen Programmdaten.

Beispiel einer JSON-Datei

Möchte ich zum Beispiel einige ausgedachte Nutzerdaten in einer .json-Datei speichern, könnte diese wiefolgt aussehen:

Example.json
{ "user" : [    
	{ 	"id" : 1,      
		"name": "Hans",      
		"age" : 25,      
		"language" : "ger",      
		"hobbys" : ["Badminton", "Tennis", "Musik"]    
	},    
	{ 	"id" : 2,      
		"name" : "Peter",      
		"age" : 40,      
		"language": "ger",      
		"hobbys" : ["Schwimmen", "Technik"]    
	}
]}

Info: Die Struktur von JSON wird einzig und allein, durch die Satzzeichen definiert. Die Zeilenumbrüche und Einrückungen dienen nur der Lesbarkeit.

Datentypen

Primitive Objekte

Im obigen Beispiel erkennt man schon am farblichen Unterschied schon, dass JSON zwischen mindestens 3 Datentypen unterscheided: Zahlen / Text / Logisch (true o. false). Die Zahlen lassen sich dabei noch in ganze Zahlen bzw. Nummern und Kommazahlen unterteilen. Wir kennen diese Unterscheidungen bereits aus Python: Int, Float, String und Boolean. Und genau wie in Python lassen sich die Strings durch Hochkommas ' oder Anführungszeichen " kenntlich machen.

Struktur Objekte

Außerdem sehen wir, dass sowohl geschweifte {} als auch eckige Klammern [] verwendet wurden. Geschweifte Klammern leiten ein untergeordnetes Objekt mit JSON-formatiertem Inhalt ein. Alles Innerhalb eines geschweiften Klammerpaares nennt sich JSON-Objekt. Und wie im obigen Beispiel ist eine Verschachtelung möglich. Die JSON-Objekte, die die Daten der jeweiligen Nutzer beinhalten sind wiederum Teil des großen JSON-Objektes in dem alle User gespeichert sind. Die eckigen Klammern leiten eine Liste von Objekten ein. Diese Listen heißen JSON-Arrays Häufig sind dies eine Reihe JSON-Objekte einer beliebigen Anzahl, wie zum Beispiel die Benutzer in unserem Fall. Aber auch Strings können direkt in einer solchen Arrays stehen. Das Python Äquivalent wäre in diesem Fall Listen nicht Arrays. Innerhalb der Objekte stehen oft bezeichnende Schlüsselwörter (key) mit einem Doppelpunkt  von ihrem Inhalt/Wert (value) getrennt. Zusammen nennt man ein solches Paar Key-Value-Pair. Auch diese sind wiederum schachtelbar, so ist der Value des Keys „user“ ein Array mit Objekten die wiederum Key-Value-Pairs enthalten.

 

JSON Python Beispiel
Number Int  1  \
Real Number Float  1.65   |
String String  „text“   | Primitiv
true false True False   |
null None  /
Object Dict  { }  \
Array List  [ ]   | Struktur
Pair Pair  “ “ : “ „  /

Anwendung

Ich denke die Vorteile dieser Schreibweise sind bereits aus dem Beispiel und der Erklärung der Datentypen klar geworden: Es ist möglich Daten unter Einhaltung ihrer Struktur zu speichern. „Einfache“ Daten wie Key-Value-Paare mit flacher Struktur zum Beispiel eine Teilnehmer Liste mit dazugehörigen Geburtsdaten und aktuellem Punktestand, könnte in einer einfachen Tabelle oder csv-Datei(?) veranschaulicht werden. Sobald aber eine Verschachtelung also eine Tabelle innerhalb einer der Einträge vorliegt, versagt eine einfache Text-Datei.

Da man als Programmierer sowieso immer (bewusst oder unbewusst) mit Objekten irgendwelcher Klassen arbeitet, bietet es sich an diese direkt in einem Format zu speichern, dass die bereits verwendeten Strukturen unterstützt. Um die Objekte unterschiedlicher Programmiersprachen in JSON-Objekte zu Übersetzen, werden sogeannte JSON-Decoder und -Encoder eingesetzt. Meist sind dies Bibliotheken die nach dem Importieren verwendet werden können. Viele Programmiersprachen wie Python bringen diese bereits von sich aus mit, sodass sie nicht manuell installiert werden müssen.

Das Speichern, beliebiger Objekte und dessen Variablen ist an sich noch kein so großer Komfortgewinn, wie die Möglichkeit diese ebenso einfach wieder einlesen und im Programm verwenden zu können. Da das JSON-Format ein Sprachen unabhängiger Standard geworden ist, auch wenn es aus JavaScript entsprung, eignet es sich auch ideal um Daten zwischen verschiedenen Programmiersprachen über Dateien oder Sockets (sogar in Echtzeit) auszutauschen. JSON ist immernoch human-readable. Es kann also auch per Hand bearbeitet werden, solange man die Grundstruktur verstanden hat. Hierbei muss allerdings sehr gut darauf geachtet werden, dass die Struktur gültig bleibt, also die Klammern auch an den richtigen Stellen geschlossen werden.

JSON und Python

Python liefert wie erwähnt eine Bibliothek zum umwandeln von JSON-Objekten in Python-Objekte (vice versa). Besagte Bibliothek trägt den eingängen Namen json . Zur verwendung von JSON beginnen wir unseren Code also mit import json .

Warnung:
Unsere Pythondatei darf nicht „json.py“ heißen, da das Script sich beim Ausführen selbst, anstelle der bibliothek importieren würde.

Da eine JSON-Datei letzendlich nichts weiter als eine Text-Datei ist, dessen Inhalt einigen Richtlinien unterliegt, lesen und schreiben wir JSON-Dateien auch genauso. Der Gesamte JSON-Inhalt kann also in einem Python String oder einer Textdatei gespeichert werden. Für beides stellt das json-Paket eine direkte Methode zur Verfügung. Mit json.dump(input, file) kann der Inhalt nach JSON formatiert und direkt in einer Datei (fileobject) gespeichert werden (die Datei muss zum schreiben geöffnet sein). Möchte man die JSON-Daten als String um sie anderweitig weiter zu verarbeiten hilft der ähnliche Befehl json.dumps(input) der ein String ausgibt. Input kann dabei jedes beliebig verschachtelte Pythonobjekt sein, das aus den oben aufgeführten Datentypen zusammengesetzt ist.

Um die JSON-Daten einzulesen dienen die Befehle json.load(file) und json.loads(string) . Das zurückgegebene Objekt ist das gleiche wie das ursprünglich zu JSON umgewandelte Objekt. Hier ein Beispiel zur verwendung und gleichzeitig eine Probe der beiden Methoden:

read and write example for string/ file in python
import json

user1 = {'id':1, 'name':'Hans', 'age':25, 'lang':'ger', 'hobbys':('Badminton', 'Tennis', 'Musik')}
user2 = {'id':2, 'name':'Peter', 'age':40, 'lang':'ger', 'hobbys':('Schwimmen', 'Technik')}
user = [user1, user2] # list of users# we can keep the JSON-Data as a string or directly write it to a file

# convert userlist to json-string
jsonstring = json.dumps(user)

# write userlist to json-file
with open('data.json', 'w') as jsonfile:  # temporary open file (write only)    
	json.dump(user, jsonfile )# once saved we can load the data from string or file
	
# load python data from string
user_from_string = json.loads(jsonstring)

# load python object directly from file
with open('data.json', 'r') as jsonfile:  # temporary open file (read only)    
	user_from_file = json.load(jsonfile)
	
	
# check same behavior as original object user	
print(user[0]['name'])print(user_from_string[0]['name'])print(user_from_file[0]['name'])

Info: Der oben stehende Python-Code führt zu einer JSON-Datei mit einem ähnlichen Inhalt wie unser Anfangsbeispiel. Allerdings ohne das einrahmende JSON-Objekt. {"user": [ .. ]} . Um exakt das selbe JSON zu erreichen, muss anstelle der user ein dict überbegen werden: json.dumps( { 'user' : user } )

 

Json und Java (LibGDX)

Ich habe Java bisher hauptsächlich in Verbindung mit LibGDX und darum auch dessen JSON-Paket benutzt. Gut möglich, dass dies unter dem Java JSON-Paket ähnlich funktioniert.

Gute Beispiele:

https://github.com/libgdx/libgdx/wiki/Reading-%26-writing-JSON

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.