Menu
Coddy logo textTech

Livello di persistenza JSON

Fa parte della sezione Programmazione orientata agli oggetti del percorso GO di Coddy. Lezione 102 di 107.

challenge icon

Sfida

Facile

Aggiungiamo la persistenza dei dati al nostro sistema di gestione della biblioteca! Implementerai un livello di persistenza JSON in grado di convertire i dati della tua biblioteca in formato JSON per salvarli e di ricaricarli da stringhe JSON. È essenziale per qualsiasi applicazione reale che debba conservare i dati tra una sessione e l'altra.

Organizzerai il codice in cinque file:

  • book.go: la tua struct Book con tag JSON per la struct, che controllano la serializzazione. Ogni campo deve avere il tag JSON corrispondente: id, title, author, isbn e available. Includi il costruttore NewBook.
  • user.go: la tua struct User con tag JSON per la struct: id, name, email e borrowed_books. Includi il costruttore NewUser.
  • data.go: crea una struct LibraryData che funga da oggetto di trasferimento per la serializzazione JSON. Deve avere due campi: Books (una slice di puntatori a Book) e Users (una slice di puntatori a User), ciascuno con i tag JSON appropriati (books e users).
  • library.go: la tua struct Library con map per libri e utenti. Aggiungi due nuovi metodi:
    • ToJSON(): converte i dati della biblioteca in una stringa JSON formattata usando json.MarshalIndent con un'indentazione di due spazi. Deve raccogliere tutti i libri e gli utenti dalle map in una struct LibraryData, quindi serializzarla.
    • FromJSON(jsonStr string): prende una stringa JSON, la deserializza in una struct LibraryData e popola le map della biblioteca con i libri e gli utenti caricati.
  • main.go: mostra il livello di persistenza creando una biblioteca e convertendola in JSON.

    Leggi il numero di libri, poi per ogni libro leggi il suo ID, il titolo, l'autore e l'ISBN. Quindi leggi il numero di utenti e, per ogni utente, leggi il suo ID, il nome e l'indirizzo email. Dopo aver popolato la biblioteca, chiama ToJSON() e stampa la stringa JSON risultante.

Verranno forniti i seguenti input:

  • Numero di libri, poi ID, titolo, autore e ISBN di ciascun libro (ciascuno su una riga separata)
  • Numero di utenti, poi ID, nome e indirizzo email di ciascun utente (ciascuno su una riga separata)

Per esempio, dati:

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

Il tuo output dovrebbe essere:

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

E dati:

1
B100
Design Patterns
Gang of Four
978-0201633610
0

Il tuo output dovrebbe essere:

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

Importante: quando iteri sulle map per creare le slice, aggiungi i libri nell'ordine B001, B002, ecc. (ordinati alfabeticamente per ID) e fai lo stesso per gli utenti. Questo garantisce un output JSON coerente. Puoi usare sort.Strings sulle chiavi della map prima di iterare.

La struct LibraryData colma il divario tra l'archiviazione basata su map e il formato basato su array di JSON. Questo schema dell'oggetto di trasferimento è comune quando si serializzano strutture dati complesse!

Provalo tu

package main

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

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

	// Crea una nuova biblioteca
	library := NewLibrary()

	// Leggi il numero di libri
	numBooksStr, _ := reader.ReadString('\n')
	numBooks, _ := strconv.Atoi(strings.TrimSpace(numBooksStr))

	// TODO: Leggi i dettagli di ogni libro (ID, titolo, autore, ISBN)
	// e aggiungili alla biblioteca
	for i := 0; i < numBooks; i++ {
		// TODO: Leggi l'ID del libro
		// TODO: Leggi il titolo del libro
		// TODO: Leggi l'autore del libro
		// TODO: Leggi l'ISBN del libro
		// TODO: Crea il libro e aggiungilo alla biblioteca
	}

	// Leggi il numero di utenti
	numUsersStr, _ := reader.ReadString('\n')
	numUsers, _ := strconv.Atoi(strings.TrimSpace(numUsersStr))

	// TODO: Leggi i dettagli di ogni utente (ID, nome, email)
	// e aggiungili alla biblioteca
	for i := 0; i < numUsers; i++ {
		// TODO: Leggi l'ID dell'utente
		// TODO: Leggi il nome dell'utente
		// TODO: Leggi l'email dell'utente
		// TODO: Crea un utente e aggiungilo alla biblioteca
	}

	// TODO: Converti la biblioteca in JSON e stampala
	fmt.Println(library.ToJSON())
}

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore Go online