Menu
Coddy logo textTech

Warstwa zapisu danych w JSON

Część sekcji Programowanie obiektowe ścieżki GO w Coddy. Lekcja 102 z 107.

challenge icon

Wyzwanie

Łatwy

Dodajmy trwałość danych do naszego systemu zarządzania biblioteką! Zaimplementujesz warstwę trwałości JSON, która potrafi konwertować dane biblioteki do formatu JSON w celu ich zapisania, a następnie wczytywać je z powrotem z ciągów JSON. Jest to niezbędne w każdej rzeczywistej aplikacji, która musi zachowywać dane między sesjami.

Rozmieścisz kod w pięciu plikach:

  • book.go: Twoja struktura Book z tagami JSON kontrolującymi serializację. Każde pole powinno mieć odpowiadający mu tag JSON: id, title, author, isbn i available. Dodaj konstruktor NewBook.
  • user.go: Twoja struktura User z tagami JSON dla pól id, name, email i borrowed_books. Dodaj konstruktor NewUser.
  • data.go: Utwórz strukturę LibraryData, która pełni rolę obiektu transferowego do serializacji JSON. Powinna mieć dwa pola: Books (tablicę wskaźników do Book) i Users (tablicę wskaźników do User), każde z odpowiednimi tagami JSON (books i users).
  • library.go: Twoja struktura Library z mapami książek i użytkowników. Dodaj dwie nowe metody:
    • ToJSON(): konwertuje dane biblioteki na sformatowany ciąg JSON za pomocą json.MarshalIndent z wcięciem wynoszącym dwie spacje. Powinna zebrać wszystkie książki i użytkowników z map do struktury LibraryData, a następnie przeprowadzić serializację.
    • FromJSON(jsonStr string): przyjmuje ciąg JSON, deserializuje go do struktury LibraryData i wypełnia mapy biblioteki wczytanymi książkami i użytkownikami.
  • main.go: Zademonstruj działanie warstwy trwałości, tworząc bibliotekę i konwertując ją do JSON.

    Wczytaj liczbę książek, a następnie dla każdej książki wczytaj jej ID, tytuł, autora i ISBN. Następnie wczytaj liczbę użytkowników, a dla każdego użytkownika wczytaj jego ID, imię i adres e-mail. Po wypełnieniu biblioteki wywołaj ToJSON() i wyświetl wynikowy ciąg JSON.

Zostaną podane następujące dane wejściowe:

  • Liczba książek, a następnie ID, tytuł, autor i ISBN każdej książki (każda wartość w osobnym wierszu)
  • Liczba użytkowników, a następnie ID, imię i adres e-mail każdego użytkownika (każda wartość w osobnym wierszu)

Na przykład, dla danych:

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

Wynik powinien być następujący:

{
  "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": []
    }
  ]
}

A dla danych:

1
B100
Design Patterns
Gang of Four
978-0201633610
0

Wynik powinien być następujący:

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

Ważne: Podczas iterowania po mapach w celu utworzenia tablic dodawaj książki w kolejności: B001, B002 itd. (posortowane alfabetycznie według ID), a użytkowników w podobny sposób. Zapewni to spójny wynik JSON. Możesz użyć sort.Strings na kluczach map przed iterowaniem.

Struktura LibraryData łączy przechowywanie danych w mapach z formatem JSON opartym na tablicach. Ten wzorzec obiektu transferowego jest często stosowany podczas serializacji złożonych struktur danych!

Spróbuj swoich sił

package main

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

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

	// Utwórz nową bibliotekę
	library := NewLibrary()

	// Odczytaj liczbę książek
	numBooksStr, _ := reader.ReadString('\n')
	numBooks, _ := strconv.Atoi(strings.TrimSpace(numBooksStr))

	// TODO: Odczytaj dane każdej książki (ID, tytuł, autor, ISBN)
	// i dodaj je do biblioteki
	for i := 0; i < numBooks; i++ {
		// TODO: Odczytaj ID książki
		// TODO: Odczytaj tytuł książki
		// TODO: Odczytaj autora książki
		// TODO: Odczytaj ISBN książki
		// TODO: Utwórz książkę i dodaj ją do biblioteki
	}

	// Odczytaj liczbę użytkowników
	numUsersStr, _ := reader.ReadString('\n')
	numUsers, _ := strconv.Atoi(strings.TrimSpace(numUsersStr))

	// TODO: Odczytaj dane każdego użytkownika (ID, imię, adres e-mail)
	// i dodaj je do biblioteki
	for i := 0; i < numUsers; i++ {
		// TODO: Odczytaj ID użytkownika
		// TODO: Wczytaj nazwę użytkownika
		// TODO: Wczytaj adres e-mail użytkownika
		// TODO: Utwórz użytkownika i dodaj go do biblioteki
	}

	// TODO: Przekształć bibliotekę na JSON i ją wyświetl
	fmt.Println(library.ToJSON())
}

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Go online