-
JSON: ein populäres Format für die Serialisierung von Daten
- Serialisierung: "Abbildung von strukturierten Daten auf eine sequenzielle Darstellungsform", insb. auf Bytefolgen wie in einer Datei oder einer Datenübertragung im Netzwerk
- JSON ist bekannt dafür, nicht erfunden, sondern "entdeckt" worden zu sein
- außerdem relativ minimal: nur sechs verschiedene Grundstrukturen
- aber trotzdem relativ universell: damit unser Ausgangspunkt für die Kartografierung der Welt der Datentypen
- außerdem Gegenüberstellung mit dem Typvorrat von Rust (einer zeitgenössischen Programmiersprache mit einem detaillierten Typsystem)
-
atomare Datentypen: einzelne Werte (C++ nennt sie "Plain Old Data" (POD), Perl nennt sie "Skalare")
- Boolean: ein Bit (wahr oder falsch)
- Typvorrat in Rust:
bool
- in JSON:
true
oder false
- Zahlen: in verschiedenen Bitgrößen, mit oder ohne Vorzeichen, Ganzzahl oder Fließkommazahl
- Typvorrat in Rust:
u8/i8, u16/i16, u32/i32, u64/i64, u128/i128, usize/isize, f32, f64
- in JSON: wie gewohnt ausgeschrieben (z.B.
42
, -23.5
) oder in wissenschaftlicher Notation (z.B. 7.297e-3
oder -6.022E23
)
- Zeichenfolgen: nicht wirklich unteilbar, aber wird für gewöhnlich als einzelner Wert verstanden
- Typvorrat in Rust:
String
(UTF-8), OsString
(Kodierung gemäß Zeichentabelle des Systems) und andere
- in JSON: als Zeichenkette mit Anführungszeichen und mit Escape-Sequenzen für nicht druckbare Zeichen (z.B.
"Mit freundlichen Grüßen\nErika Mustermann"
)
- fehlender Wert: in JSON
null
(heißt woanders vielleicht auch nil
)
- Typvorrat in Rust: siehe später
-
Listen: ein abgeleiteter Datentyp
- deswegen vorhin "atomar": der Typ einer Liste bestimmt sich aus dem Typ der Elemente (in statisch typisierten Programmiersprachen ist z.B. "Liste von 8-Bit-Zahlen" etwas anderes als "Liste von Strings" oder "Liste von Listen von Strings")
- Typvorrat in Rust:
- mit variabler Länge:
Vec<X>
, wobei X
für den Typ der Elemente steht (Beispiele zu oben: Vec<u8>
, Vec<String>
, Vec<Vec<String>>
); der Name "Vec" deutet auf die Struktur im Arbeitsspeicher hin
- mit fester Länge:
[X; N]
, wobei N
für die Anzahl von Elementen steht
- in JSON: kommagetrennte Liste der Elemente in eckigen Klammern (z.B.
[42, 23]
)
- Unterschiede zu Rust:
- JSON ist nicht statisch typisiert und hat nur einen Listentyp, der alle möglichen Elemente enthalten kann und beliebig lang sein kann (z.B.
[42, "Hallo", []]
)
-
assoziative Datenfelder: ein anderer abgeleiteter Datentyp
- enthält nicht einzelne Elemente, sondern Paare von Schlüssel und Wert; ermöglicht schnellen Zugriff auf einen Wert anhand seines Schlüssels
- heißt je nach Programmiersprache bzw. Datenformat "Objekt", "Map", "Dictionary" etc.
- Typvorrat in Rust: unter anderem
HashMap<K, V>
, wobei K
der Schlüsseltyp ("key") und V
der Werttyp ("value") ist; der Name "HashMap" deutet auf die Struktur im Arbeitsspeicher hin
- in JSON: kommagetrennte Liste von Wertpaaren in geschweiften Klammern, die Wertpaare jeweils mit Doppelpunkt getrennt; der Schlüssel muss ein String sein (z.B.
{"Karo": 9, "Herz": 10, "Pik": 11, "Kreuz": 12}
)
- wiederum Unterschied zu Rust: Werte verschiedener Typen dürfen gemischt werden
-
Damit ist alles beschrieben, was JSON kann, doch es gibt so viel mehr! Beispiele für abgeleitete Datentypen:
- Mengen ("Sets"): wie Listen, aber ohne definierte Ordnung
- in Rust:
HashSet<X>
; der Name "HashSet" deutet auf die Struktur im Arbeitsspeicher hin
- Graphen: Netzwerke von Knoten mit Kanten dazwischen (z.B. Straßenkarte: Kreuzungen = Knoten, Straßen = Kanten)
- in Rust: kein entsprechender Typ in der Standardbibliothek
- ähnlich wie bei Listen und assoziativen Datenfeldern viele verschiedene Implementationsstrategien, aber bei Graphen gibt es keinen "Standardansatz"
- Außerdem ist JSON relativ restriktiv in der Auswahl an PODs. Andere Serialisierungsformate unterstützen zum Beispiel Datums- oder Zeitangaben, Referenzen auf externe Dateien etc.
-
im Gespräch erwähnt