Menu
Coddy logo textTech

JSON-Persistenzschicht

Teil des Abschnitts Objektorientierte Programmierung der GO-Journey von Coddy — Lektion 102 von 107.

challenge icon

Aufgabe

Einfach

Lassen wir uns eine Datenpersistenz zu unserem Bibliotheksverwaltungssystem hinzufügen! Sie werden eine JSON-Persistenzschicht implementieren, die die Daten Ihrer Bibliothek zum Speichern in das JSON-Format konvertieren und aus JSON-Strings wieder laden kann. Dies ist für jede reale Anwendung unerlässlich, die Daten zwischen Sitzungen erhalten muss.

Sie werden Ihren Code auf fünf Dateien verteilen:

  • book.go: Ihr Book-Struct mit JSON-Struct-Tags zur Steuerung der Serialisierung. Jedes Feld sollte ein entsprechendes JSON-Tag haben: id, title, author, isbn und available. Fügen Sie Ihren NewBook-Konstruktor hinzu.
  • user.go: Ihr User-Struct mit JSON-Struct-Tags für id, name, email und borrowed_books. Fügen Sie Ihren NewUser-Konstruktor hinzu.
  • data.go: Erstellen Sie ein LibraryData-Struct, das als Transferobjekt für die JSON-Serialisierung dient. Es sollte zwei Felder haben: Books (ein Slice von Book-Pointern) und Users (ein Slice von User-Pointern), jeweils mit entsprechenden JSON-Tags (books und users).
  • library.go: Ihr Library-Struct mit Maps für Bücher und Benutzer. Fügen Sie zwei neue Methoden hinzu:
    • ToJSON() — konvertiert die Daten der Bibliothek in einen formatierten JSON-String unter Verwendung von json.MarshalIndent mit einer Einrückung von zwei Leerzeichen. Es sollte alle Bücher und Benutzer aus den Maps in einem LibraryData-Struct sammeln und dieses dann serialisieren.
    • FromJSON(jsonStr string) — nimmt einen JSON-String entgegen, unmarshalt ihn in ein LibraryData-Struct und füllt die Maps der Bibliothek mit den geladenen Büchern und Benutzern.
  • main.go: Demonstrieren Sie die Persistenzschicht, indem Sie eine Bibliothek aufbauen und diese in JSON konvertieren.

    Lesen Sie die Anzahl der Bücher ein, dann für jedes Buch dessen ID, Titel, Autor und ISBN. Lesen Sie als Nächstes die Anzahl der Benutzer ein und für jeden Benutzer dessen ID, Name und E-Mail. Nachdem Sie die Bibliothek gefüllt haben, rufen Sie ToJSON() auf und geben Sie den resultierenden JSON-String aus.

Die folgenden Eingaben werden bereitgestellt:

  • Anzahl der Bücher, dann die ID, der Titel, der Autor und die ISBN jedes Buches (jeweils in separaten Zeilen)
  • Anzahl der Benutzer, dann die ID, der Name und die E-Mail jedes Benutzers (jeweils in separaten Zeilen)

Zum Beispiel, gegeben:

2
B001
The Go Programming Language
Alan Donovan
978-0134190440
B002
Clean Code
Robert Martin
978-0132350884
1
U001
Alice Smith
alice@library.com

Ihre Ausgabe sollte wie folgt aussehen:

{
  "books": [
    {
      "id": "B001",
      "title": "The Go Programming Language",
      "author": "Alan Donovan",
      "isbn": "978-0134190440",
      "available": true
    },
    {
      "id": "B002",
      "title": "Clean Code",
      "author": "Robert Martin",
      "isbn": "978-0132350884",
      "available": true
    }
  ],
  "users": [
    {
      "id": "U001",
      "name": "Alice Smith",
      "email": "alice@library.com",
      "borrowed_books": []
    }
  ]
}

Und gegeben:

1
B100
Design Patterns
Gang of Four
978-0201633610
0

Ihre Ausgabe sollte wie folgt aussehen:

{
  "books": [
    {
      "id": "B100",
      "title": "Design Patterns",
      "author": "Gang of Four",
      "isbn": "978-0201633610",
      "available": true
    }
  ],
  "users": []
}

Wichtig: Wenn Sie über Maps iterieren, um Ihre Slices zu erstellen, fügen Sie Bücher in der Reihenfolge: B001, B002 usw. hinzu (alphabetisch nach ID sortiert) und Benutzer entsprechend. Dies gewährleistet eine konsistente JSON-Ausgabe. Sie können sort.Strings auf den Map-Keys verwenden, bevor Sie iterieren.

Das LibraryData-Struct schließt die Lücke zwischen Ihrer Map-basierten Speicherung und dem Array-basierten Format von JSON. Dieses Transferobjekt-Muster ist üblich, wenn komplexe Datenstrukturen serialisiert werden!

Probier es selbst

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	reader := bufio.NewReader(os.Stdin)

	// Eine neue Bibliothek erstellen
	library := NewLibrary()

	// Anzahl der Bücher lesen
	numBooksStr, _ := reader.ReadString('\n')
	numBooks, _ := strconv.Atoi(strings.TrimSpace(numBooksStr))

	// TODO: Details jedes Buches lesen (ID, title, author, ISBN)
	// und sie zur Bibliothek hinzufügen
	for i := 0; i < numBooks; i++ {
		// TODO: Buch-ID lesen
		// TODO: Buchtitel lesen
		// TODO: Buchautor lesen
		// TODO: Buch-ISBN lesen
		// TODO: Buch erstellen und zur Bibliothek hinzufügen
	}

	// Anzahl der Benutzer lesen
	numUsersStr, _ := reader.ReadString('\n')
	numUsers, _ := strconv.Atoi(strings.TrimSpace(numUsersStr))

	// TODO: Details jedes Benutzers lesen (ID, name, email)
	// und sie zur Bibliothek hinzufügen
	for i := 0; i < numUsers; i++ {
		// TODO: Benutzer-ID lesen
		// TODO: Benutzernamen lesen
		// TODO: Benutzer-E-Mail lesen
		// TODO: Benutzer erstellen und zur Bibliothek hinzufügen
	}

	// TODO: Bibliothek in JSON konvertieren und ausgeben
	fmt.Println(library.ToJSON())
}

Alle Lektionen in Objektorientierte Programmierung