Was ist JSON und wie prüft man es?
JSON (JavaScript Object Notation) ist ein Textformat, in dem Web-APIs Daten austauschen: Zahlen, Text, Listen und Objekte in einer festen Schreibweise. Wer JSON lesen und prüfen kann, erkennt falsche Daten, bevor sie in einer Datenbank landen.
Ein Buch der Hochschulbibliothek ist ein JSON-Objekt. Die App schickt es an die API, und die API muss entscheiden, ob es stimmt.
Am Ende dieser Lektion
Notiz
Ich kann JSON lesen, schreiben und feldweise auf richtige Typen prüfen.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Objekt | eine Gruppe von Feldern in geschweiften Klammern | {"jahr": 2021} |
| Array | eine Liste von Werten in eckigen Klammern | [1, 2, 3] |
| Schlüssel | der Name eines Feldes, immer in doppelten Anführungszeichen | "titel" |
| Datentyp | die Art eines Wertes: Text, Zahl, wahr oder falsch, null | |
| null | der Wert, der sagt: hier ist nichts | |
| Validierung | das Prüfen, ob Daten die Regeln erfüllen |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
JSON kennt nur sechs Arten von Werten
Ein Objekt ist eine Gruppe von Feldern in {}. Ein Array ist eine Liste in []. Dazu kommen Text in doppelten Anführungszeichen, eine Zahl, true oder false und null.
Jedes Feld hat einen Schlüssel in Anführungszeichen, einen Doppelpunkt und einen Wert. Felder trennt ein Komma, aber nach dem letzten steht keines.
Ein Beispiel: ein Buch als JSON-Objekt
{
"titel": "Netze verstehen",
"fach": "Informatik",
"jahr": 2021,
"exemplare": 2,
"verfuegbar": true,
"schlagworte": ["Netzwerk", "Protokolle"],
"rezension": null
}JSON in Python einlesen
import json
# Der Text kommt so von einer API. Python macht daraus ein Dictionary.
text = '{"titel": "Netze verstehen", "jahr": 2021, "exemplare": 2, "verfuegbar": true}'
buch = json.loads(text)
print(buch["titel"])
print(type(buch["jahr"]))
print(buch["verfuegbar"])
# Ändern Sie "jahr": 2021 in "jahr": "2021" und starten Sie noch einmal.
Die API liefert und frisst JSON
Im Lab schreibt die API jede Zeile als JSON-Objekt. Fragen Sie nach einer Liste, kommt ein Array von Objekten zurück. Mit einem besonderen Accept-Header bekommen Sie ein einzelnes Objekt.
Schicken Sie danach absichtlich falsche Daten. Die Datenbank prüft die Typen und lehnt ab.
psql das Passwort geben
export PGPASSWORD=shopHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Tabelle buecher anlegen und füllen
psql -h db -U shop -c "drop table if exists buecher cascade; create table buecher (id serial primary key, titel text not null, fach text not null, jahr int not null, exemplare int not null default 1); insert into buecher (titel, fach, jahr, exemplare) values ('Algorithmen kompakt', 'Informatik', 2019, 3), ('Netze verstehen', 'Informatik', 2021, 2), ('Statistik fuer alle', 'Mathematik', 2018, 1), ('Schreiben im Studium', 'Sprache', 2020, 4); notify pgrst, 'reload schema'"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein einzelnes Objekt statt einer Liste
curl -s -w "\n" -H "Accept: application/vnd.pgrst.object+json" "http://api:3000/buecher?id=eq.2"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein Jahr als Text senden
curl -s -o /dev/null -w "%{http_code}\n" -X POST -H "Content-Type: application/json" -d '{"titel":"Falsch","fach":"Test","jahr":"neunzehn"}' "http://api:3000/buecher"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Kaputtes JSON senden
curl -s -o /dev/null -w "%{http_code}\n" -X POST -H "Content-Type: application/json" -d '{"titel":' "http://api:3000/buecher"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Prüfen heißt: jedes Feld gegen eine Regel halten
Eine API sollte Daten prüfen, bevor sie sie weitergibt. Gehen Sie Feld für Feld vor. Fehlt es? Hat es den richtigen Typ? Liegt der Wert im erlaubten Bereich?
Sammeln Sie alle Fehler in einer Liste, statt beim ersten aufzuhören. So erfahren Nutzende mit einer Antwort, was alles zu ändern ist.
Ein Beispiel: die Regeln für ein Buch
| Feld | Typ | Regel |
|---|---|---|
| titel | Text | Nicht leer |
| fach | Text | Nicht leer |
| jahr | Ganze Zahl | Zwischen 1450 und 2100 |
| exemplare | Ganze Zahl | 0 oder mehr |
| verfuegbar | Wahr oder falsch | Nur true oder false |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Den Typ prüfen, nicht nur den Wert
wert = True
# In Python zählt True auch als ganze Zahl. Das ist eine Falle.
print(isinstance(wert, int))
print(type(wert) == int)
print(type(2021) == int)
print(type("2021") == int)
Ein häufiger Fehler
Warnung
Viele glauben, 2021 und "2021" seien dasselbe, weil sie gleich aussehen. Das eine ist eine Zahl, das andere ein Text. Prüfen Sie den Typ eines Feldes und nicht nur sein Aussehen, sonst rechnet eine App später mit Text.