Die JavaScript Object Notation ist ein kompaktes Datenformat in einer einfach lesbaren Textform für den Datenaustausch zwischen Anwendungen. JSON ist von Programmiersprachen unabhängig. Parser und Generatoren existieren in allen verbreiteten Sprachen.
Im Normalfall wird die Dateiendung “*.JSON” verwendet. Der Inhalt eines JSON Dokuments ist grundsätzlich Objektorientiert aufgebaut.
Ein JSON Dokument beginnt und endet immer mit ‘{‘ und ‘}’. Zwischen den geschweiften Klammern werden die Inhalte platziert. Die geschweiften Klammern umfassen ein Objekt. Im Dokument selbst können wiederum weitere Objekte definiert werden. Ein Datenfeld wird mit einem Namen eingeleitet und der Wert folgt nach einem Doppelpunkt. Der Wert kann dann wieder ein Objekt sein.

JSON Daten Typen
In JSON kannst du verschiedene Datentypen verwenden:
- Strings: Eine Sequenz von Zeichen, umgeben von doppelten Anführungszeichen. Zum Beispiel:
"Hallo Welt"
. - Nummern: Ganze Zahlen oder Fließkommazahlen. Es gibt keine Unterscheidung zwischen integer und float, somit ist
25
und25.0
beide gültig. - Booleans: Der Wert entweder
true
oderfalse
. - Null: Ein literal
null
wird verwendet, um einen leeren oder nicht existenten Wert zu repräsentieren. - Objekte: Wie bereits erwähnt, eine Menge von Schlüssel-Wert-Paaren.
- Arrays: Eine Liste von Werten, die oben genannte Typen einschließen können.
Um mit Python und JSON zu arbeiten, muss es importiert werden:
import JSON
Dann kann die Datei festgelegt werden, unter der die Daten von JSON gespeichert werden sollen.
with open(‚daten.json‘, ‚r‘) as jsonfile:
Hier sind einige wichtige Möglichkeiten und Funktionen für die Arbeit mit JSON in Python:
1. JSON-Daten lesen und schreiben
import json
# JSON-Datei lesen
with open('daten.json', 'r') as jsonfile:
daten = json.load(jsonfile)
# JSON-Datei schreiben
with open('neue_daten.json', 'w') as jsonfile:
json.dump(daten, jsonfile, indent=4)
2. JSON-Strings parsen und erstellen
# JSON-String parsen
json_string = '{"name": "Max", "alter": 30}'
daten = json.loads(json_string)
# Python-Objekt in JSON-String umwandeln
python_dict = {"name": "Anna", "alter": 25}
json_string = json.dumps(python_dict)
3. Arbeiten mit verschachtelten Strukturen
JSON unterstützt verschachtelte Strukturen, die in Python als verschachtelte Dictionaries und Listen dargestellt werden:
komplexe_daten = {
"person": {
"name": "Max",
"alter": 30,
"hobbys": ["Lesen", "Sport", "Reisen"]
}
}
# Zugriff auf verschachtelte Daten
name = komplexe_daten["person"]["name"]
erstes_hobby = komplexe_daten["person"]["hobbys"][0]
4. Formatierung und Optionen
# JSON mit Einrückung formatieren
formatierter_json_string = json.dumps(daten, indent=4)
# Sortierte Schlüssel
sortierter_json_string = json.dumps(daten, sort_keys=True)
# Nicht-ASCII-Zeichen beibehalten
unicode_json_string = json.dumps(daten, ensure_ascii=False)
5. Fehlerbehandlung
try:
daten = json.loads(ungültiger_json_string)
except json.JSONDecodeError as e:
print(f"Fehler beim Parsen des JSON: {e}")
6. Benutzerdefinierte Objekte
Für komplexere Anwendungsfälle können Sie benutzerdefinierte Encoder und Decoder erstellen:
class CustomEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, CustomObject):
return obj.to_dict()
return super().default(obj)
json.dumps(custom_obj, cls=CustomEncoder)
Diese Möglichkeiten machen JSON zu einem vielseitigen und leistungsfähigen Tool für die Datenspeicherung und den Datenaustausch in Python-Anwendungen.
Um den Inhalt einer JSON-Datei sinnvoll anzuzeigen, können Sie die json.dumps()
Funktion in Python verwenden. Hier sind einige nützliche Optionen:
- Verwenden Sie den
indent
Parameter für eine leserliche Einrückung:
import json
with open('ihre_datei.json', 'r') as file:
data = json.load(file)
formatted_json = json.dumps(data, indent=4)
print(formatted_json)
- Sortieren Sie die Schlüssel alphabetisch mit
sort_keys=True
:
formatted_json = json.dumps(data, indent=4, sort_keys=True)
- Für nicht-ASCII-Zeichen, verwenden Sie
ensure_ascii=False
:
formatted_json = json.dumps(data, indent=4, ensure_ascii=False)
- Passen Sie die Trennzeichen an:
formatted_json = json.dumps(data, indent=4, separators=(", ", ": "))
Diese Optionen machen die JSON-Ausgabe lesbarer und übersichtlicher. Für eine noch kompaktere Darstellung von Listen können Sie die pprint
-Bibliothek verwenden:
import pprint
pretty_json = pprint.pformat(data, compact=True, width=88)
print(pretty_json.replace("'", '"'))
Dies erzeugt eine kompakte, aber immer noch gut lesbare Darstellung der JSON-Daten.
Prüfen, ob eine .json Datei existiert:
if os.path.exists('todo.json'):
with open('todo.json', 'r') as jsonfile:
daten = json.load(jsonfile)
else:
daten = []
# Aufgaben laden oder neue Liste anlegen
if os.path.exists('todo.json'):
with open('todo.json', 'r') as jsonfile:
daten = json.load(jsonfile)
else:
daten = []
Der Fehler json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
tritt auf, weil deine Datei todo.json
existiert, aber leer ist. Das json.load()
-Modul kann mit einer leeren Datei nicht umgehen.
Lösung: Fehler abfangen, wenn Datei leer ist
Du kannst das Problem so lösen:
import os
import json
daten = []
if os.path.exists('todo.json'):
with open('todo.json', 'r') as jsonfile:
try:
daten = json.load(jsonfile)
except json.JSONDecodeError:
daten = []
else:
daten = []
Erklärung:
- Mit dem
try...except
-Block fängst du den Fehler ab, falls die Datei leer oder ungültig ist, und startest dann einfach mit einer leeren Liste.
Eingabe aus dem Entry
-Feld in deiner todo.json
speichern
Damit die Eingabe aus dem Entry
-Feld in deiner todo.json
gespeichert wird, musst du eine Funktion schreiben, die Folgendes tut:
- Den Inhalt des Eingabefelds ausliest.
- Den Inhalt zur Liste
daten
hinzufügt. - Die aktualisierte Liste als JSON in die Datei schreibt.
Du musst außerdem den Button so konfigurieren, dass er diese Funktion beim Klicken ausführt.
Hier ist dein kompletter, angepasster Code:
import tkinter as tk
from tkinter import messagebox
import os
import json
daten = []
if os.path.exists('todo.json'):
with open('todo.json', 'r') as jsonfile:
try:
daten = json.load(jsonfile)
except json.JSONDecodeError:
daten = []
else:
daten = []
def eingabe_speichern():
eintrag = e1.get().strip()
if eintrag:
daten.append(eintrag)
with open('todo.json', 'w') as jsonfile:
json.dump(daten, jsonfile, indent=4)
e1.delete(0, tk.END) # Eingabefeld leeren
messagebox.showinfo("Erfolg", "Eintrag gespeichert!")
else:
messagebox.showwarning("Fehler", "Bitte gib einen Text ein.")
# Hauptfenster
root = tk.Tk()
root.geometry("300x400")
# Label hinzufügen
l1 = tk.Label(root, text="To-Do Liste", fg="red", font="Times 16 bold")
l1.pack()
# Eingabefeld erstellen
e1 = tk.Entry(root)
e1.pack()
# Button mit Funktion verknüpfen
b1 = tk.Button(root, text="Eingabe speichern", command=eingabe_speichern)
b1.pack()
root.mainloop()
- Die Funktion
eingabe_speichern()
übernimmt das Speichern. - Der Button
b1
bekommt das Argumentcommand=eingabe_speichern
. - Nach dem Speichern wird das Eingabefeld geleert und eine Info-Box angezeigt.

Eingaben sofort im Fenster anzeigen
Um die Eingaben sofort im Fenster anzuzeigen, kannst du ein Widget wie eine Listbox
oder ein Label
verwenden und dieses nach jeder Eingabe aktualisieren. Die beste und flexibelste Methode ist, die aktuelle To-Do-Liste in einer Listbox
darzustellen und nach jedem Speichern zu aktualisieren. So sieht der Ablauf aus:
- Nach dem Klick auf „Eingabe speichern“ wird der neue Eintrag zur Liste hinzugefügt, in der JSON-Datei gespeichert und die Listbox im Fenster aktualisiert.
- Die Listbox zeigt immer den aktuellen Stand der To-Do-Liste an.
import tkinter as tk
from tkinter import messagebox
import os
import json
daten = []
if os.path.exists('todo.json'):
with open('todo.json', 'r') as jsonfile:
try:
daten = json.load(jsonfile)
except json.JSONDecodeError:
daten = []
else:
daten = []
def eingabe_speichern():
eintrag = e1.get().strip()
if eintrag:
daten.append(eintrag)
with open('todo.json', 'w') as jsonfile:
json.dump(daten, jsonfile, indent=4)
e1.delete(0, tk.END)
update_listbox()
messagebox.showinfo("Erfolg", "Eintrag gespeichert!")
else:
messagebox.showwarning("Fehler", "Bitte gib einen Text ein.")
def update_listbox():
listbox.delete(0, tk.END)
for eintrag in daten:
listbox.insert(tk.END, eintrag)
root = tk.Tk()
root.geometry("300x400")
l1 = tk.Label(root, text="To-Do Liste", fg="red", font="Times 16 bold")
l1.pack()
e1 = tk.Entry(root)
e1.pack()
b1 = tk.Button(root, text="Eingabe speichern", command=eingabe_speichern)
b1.pack()
listbox = tk.Listbox(root)
listbox.pack(fill=tk.BOTH, expand=True)
update_listbox() # Initiale Anzeige der geladenen Daten
root.mainloop()

