6 Dateistrukturformate

6.1 Einführung

Dateistrukturformate bieten eine standardisierte Methode zur Darstellung und Speicherung von Daten. Diese Formate erleichtern den Austausch und die Verarbeitung von Daten zwischen verschiedenen Softwareanwendungen und Systemen. Zu den beliebtesten Dateistrukturformaten gehören XML, JSON, YAML und TOML, die jeweils einzigartige Merkmale und Verwendungszwecke aufweisen.

6.1.1 XML (Extensible Markup Language)

XML ist eine Auszeichnungssprache, die eine strukturierte Darstellung von Daten ermöglicht. Sie verwendet Tags, um Elemente zu definieren und Daten in einer Baumstruktur zu speichern. XML bietet Unterstützung für Schemata zur Validierung und Erstellung benutzerdefinierter Typen sowie für Namensräume zur Vermeidung von Kollisionen zwischen Elementen. XML ist eine generelle Sprache, die eine gemeinsame Syntax für verschiedene Formate ermöglicht, jedoch wird sie aufgrund ihrer Verbose oft als weniger leicht lesbar angesehen.

6.1.2 JSON (JavaScript Object Notation)

JSON ist ein leichtgewichtiges Datenformat, das eine einfache Darstellung von Daten in Form von Schlüssel-Wert-Paaren ermöglicht. Es ist sehr menschenlesbar und bietet eine klare und einfache Syntax. JSON wurde aus JavaScript abgeleitet, ist jedoch sprachunabhängig. Es eignet sich gut für einfache Strukturen, bietet jedoch keine Unterstützung für Namensräume, Kommentare oder Attribute, und die Unterstützung von Datentypen ist begrenzt.

6.1.3 YAML (YAML Ain’t Markup Language)

YAML ist ein sehr menschenlesbares Datenformat, das sowohl Listen als auch assoziative Arrays unterstützt. Es verwendet Einrückungen, um strukturierte Daten zu definieren. YAML ist eine Obermenge von JSON und kann daher JSON-Dateien enthalten und in JSON transformiert werden. Es bietet Unterstützung für verschiedene unabhängige Objekttypen, jedoch kann die Einrückungsformatierung zu Syntax- und Validierungsfehlern führen.

6.1.4 TOML (Tom’s Obvious, Minimal Language)

TOML zielt darauf ab, ein minimales Konfigurationsdateiformat zu sein, das leicht zu lesen und zu schreiben ist. Es ist für die Speicherung von Konfigurationsdaten konzipiert und stellt eine leicht lesbare Alternative zu anderen Konfigurationsdateiformaten wie JSON und XML dar. TOML-Dateien bestehen aus Schlüssel-Wert-Paaren und sollen leicht in Datenstrukturen in einer Vielzahl von Sprachen geparst werden können. Im Gegensatz zu YAML und XML, die Einrückungen bzw. Tags verwenden, ähnelt TOML in gewisser Weise dem Microsoft Windows .ini-Dateiformat.

Die Auswahl des geeigneten Dateistrukturformats hängt von den spezifischen Anforderungen des Projekts und den Vorlieben des Entwicklerteams ab. Jedes Format hat seine eigenen Stärken und Schwächen, die sorgfältig gegeneinander abgewogen werden müssen, um die bestmögliche Entscheidung zu treffen.

6.2 YAML (YAML Ain’t Markup Language)

YAML ist eine beliebtes Format zur Datenserialisierungs, das sich durch seine Einfachheit und Lesbarkeit auszeichnet. Es wird häufig verwendet, um Konfigurationsdateien zu schreiben, Daten zu persistieren, Internet-Messaging zu ermöglichen und Daten zwischen verschiedenen Programmiersprachen auszutauschen. YAML-Dateien haben entweder die Erweiterung .yaml oder .yml. Es ist bekannt für seine breite Anwendung in der DevOps-Domäne, wo es mit Werkzeugen wie Kubernetes, Ansible und Terraform verwendet wird.

6.2.1 Struktur und Syntax

YAML definiert drei Hauptknotentypen: 1. Mappings / Dictionaries: - Ungeordnete Sammlungen von Schlüssel-Wert-Paaren, wobei jeder Schlüssel einzigartig sein muss.

name: "YAML Ain't Markup Language"
type: awesome
born: 2001
  1. Sequenzen / Listen:
languages:
  - YAML
  - JAVA
  - XML
  - Python
  - C
  1. Literale (Strings, Zahlen, Booleans, etc.):
message: "Hello, World!"

Die Einrückung wird verwendet, um die Verschachtelung anzuzeigen, wobei nur Leerzeichen (nicht Tabs) für die Einrückung verwendet werden dürfen. Die Anzahl der für die Einrückung verwendeten Leerzeichen ist nicht festgelegt, muss jedoch konsistent sein.

6.2.2 Strings in YAML

Strings müssen nicht zitiert werden, es sei denn, sie enthalten spezielle Zeichen oder Werte, die missverstanden werden könnten. Es gibt zwei spezielle Formen von Strings in YAML:

  1. Faltende Strings:
message: >
  even though
  it looks like
  this is a multiline message,
  it is actually not
  1. Blockstrings:
message: |
  this is
  a real multiline
  message

6.2.2.1 Beispiele

Ein einfacher Überblick über eine YAML-Datei:

---
# Eine Beispiel-YAML-Datei
company: spacelift
domain:
 - devops
 - devsecops
tutorial:
  - yaml:
      name: "YAML Ain't Markup Language"
      type: awesome
      born: 2001
  - json:
      name: JavaScript Object Notation
      type: great
      born: 2001
  - xml:
      name: Extensible Markup Language
      type: good
      born: 1996
author: omkarbirade
published: true

YAML wird in einer Vielzahl von Szenarien eingesetzt, zum Beispiel in Kubernetes:

apiVersion: v1
kind: Pod
metadata:
  name: apache-pod
  labels:
    app: web

In diesem Beispiel definiert die YAML-Datei die Version der API, die Art der Kubernetes-Ressource und Metadaten über die Ressource.

6.2.3 Vorsicht bei der Verwendung von Leerzeichen und Tabs in YAML

Es ist wichtig zu betonen, dass die korrekte Verwendung von Leerzeichen und Tabs entscheidend für die korrekte Funktionalität von YAML-Dateien ist. YAML setzt auf Einrückungen zur Darstellung von Verschachtelungen, wobei die Einrückungen ausschließlich mit Leerzeichen und nicht mit Tabulatoren erfolgen müssen. Ein häufiger Fehler, der gemacht wird, ist die Verwendung von Tabs anstelle von Leerzeichen oder eine inkonsistente Verwendung von Leerzeichen, was zu Syntaxfehlern und schwer zu diagnostizierenden Problemen führen kann.

Die Anzahl der Leerzeichen in einer Einrückung ist zwar nicht festgelegt, muss jedoch innerhalb einer Datei konsistent sein. Beispielsweise, wenn Sie mit zwei Leerzeichen einrücken, müssen Sie dies durchgängig in der gesamten YAML-Datei beibehalten. Ein Mischen von Einrückungsstilen kann zu unerwartetem Verhalten und Fehlern führen, die schwer zu erkennen und zu beheben sein können.

Es wird dringend empfohlen, ein Textbearbeitungsprogramm oder eine integrierte Entwicklungsumgebung (IDE) zu verwenden, die YAML-spezifische Syntaxhervorhebung und Einrückungskontrolle bietet, um diese Art von Fehlern zu minimieren. Darüber hinaus können YAML-Linter und Validatoren hilfreich sein, um Einrückungsfehler und andere Syntaxprobleme zu identifizieren, bevor die YAML-Dateien angewendet werden.

6.3 JSON (JavaScript Object Notation)

JSON ist ein leichtgewichtiges Datenaustausch Format, das für Menschen einfach zu lesen und zu schreiben und für Maschinen einfach zu parsen und zu generieren ist. Es ist ein Textformat, das völlig unabhängig von Programmiersprachen ist, aber die Konventionen, die Programmierern aller C-basierten Sprachen bekannt sind, verwendet.

JSON ist auch für die Konfiguration und Datenübertragung in vielen Programmiersprachen und Frameworks weit verbreitet, da es einfach zu lesen und zu schreiben ist und gut mit asynchronen Webanwendungen arbeitet. Es ist in vielen Programmiersprachen nativ unterstützt, was das Parsen und Generieren von JSON-Daten erleichtert.

6.3.1 Struktur und Syntax

JSON-Daten bauen auf zwei Grundstrukturen auf:

  1. Name-Wert-Paare:
    {"name": "John", "age": 30}
  2. Geordnete Liste von Werten:
    ["Ford", "BMW", "Fiat"]

Jeder dieser Datentypen kann in JSON-Datenstrukturen verschachtelt werden, um komplexe, hierarchische Datenstrukturen zu erzeugen.

6.3.2 Datentypen

JSON unterstützt verschiedene Datentypen, darunter: - String: Eine Zeichenfolge aus Unicode-Zeichen, zwischen Anführungszeichen. - Number: Eine ganze oder Gleitkommazahl. - Object: Ein ungeordneter Satz von Schlüssel-Wert-Paaren. - Array: Eine geordnete Liste von Werten. - Boolean: true oder false. - null: Ein leerer Wert.

{
  "string": "This is a string",
  "number": 10,
  "object": {"key": "value"},
  "array": [1, 2, 3],
  "boolean": true,
  "null": null
}

6.3.2.1 Beispiel für verschachtelte Strukturen

{
  "name": "John",
  "age": 30,
  "isEmployed": true,
  "addresses": [
    {
      "street": "123 Main St",
      "city": "Springfield",
      "state": "IL"
    },
    {
      "street": "456 Oak St",
      "city": "Springfield",
      "state": "IL"
    }
  ],
  "phoneNumbers": ["123-456-7890", "987-654-3210"]
}

In diesem Beispiel repräsentiert jeder Schlüssel eine Eigenschaft einer Person und die Werte können verschiedene Datentypen haben, einschließlich Strings, Zahlen, Booleans, Arrays und Objekte.