Menu
Coddy logo textTech

Capa de persistencia JSON

Parte de la sección Programación Orientada a Objetos del Journey de GO de Coddy. Lección 102 de 107.

challenge icon

Desafío

Fácil

¡Añadamos persistencia de datos a nuestro sistema de gestión de bibliotecas! Implementarás una capa de persistencia JSON que pueda convertir los datos de tu biblioteca al formato JSON para guardarlos y cargarlos de nuevo desde cadenas JSON. Esto es esencial para cualquier aplicación real que necesite conservar los datos entre sesiones.

Organizarás tu código en cinco archivos:

  • book.go: Tu estructura Book con etiquetas de estructura JSON para controlar la serialización. Cada campo debe tener una etiqueta JSON correspondiente: id, title, author, isbn y available. Incluye tu constructor NewBook.
  • user.go: Tu estructura User con etiquetas de estructura JSON para id, name, email y borrowed_books. Incluye tu constructor NewUser.
  • data.go: Crea una estructura LibraryData que actúe como objeto de transferencia para la serialización JSON. Debe tener dos campos: Books (un slice de punteros a Book) y Users (un slice de punteros a User), cada uno con las etiquetas JSON apropiadas (books y users).
  • library.go: Tu estructura Library con mapas para libros y usuarios. Añade dos métodos nuevos:
    • ToJSON(): convierte los datos de la biblioteca en una cadena JSON con formato usando json.MarshalIndent con una indentación de dos espacios. Debe recopilar todos los libros y usuarios de los mapas en una estructura LibraryData y después serializarla.
    • FromJSON(jsonStr string): recibe una cadena JSON, la deserializa en una estructura LibraryData y rellena los mapas de la biblioteca con los libros y usuarios cargados.
  • main.go: Demuestra la capa de persistencia creando una biblioteca y convirtiéndola a JSON.

    Lee el número de libros y, después, para cada libro, lee su ID, título, autor e ISBN. A continuación, lee el número de usuarios y, para cada usuario, lee su ID, nombre y correo electrónico. Después de rellenar la biblioteca, llama a ToJSON() e imprime la cadena JSON resultante.

Se proporcionarán las siguientes entradas:

  • Número de libros y, después, el ID, título, autor e ISBN de cada libro (cada uno en una línea separada)
  • Número de usuarios y, después, el ID, nombre y correo electrónico de cada usuario (cada uno en una línea separada)

Por ejemplo, dada la siguiente entrada:

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

Tu salida debe ser:

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

Y dada la siguiente entrada:

1
B100
Design Patterns
Gang of Four
978-0201633610
0

Tu salida debe ser:

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

Importante: Al recorrer los mapas para crear tus slices, añade los libros en este orden: B001, B002, etc. (ordenados alfabéticamente por ID), y haz lo mismo con los usuarios. Esto garantiza una salida JSON consistente. Puedes usar sort.Strings en las claves del mapa antes de recorrerlo.

La estructura LibraryData conecta el almacenamiento basado en mapas con el formato basado en arrays de JSON. ¡Este patrón de objeto de transferencia es común al serializar estructuras de datos complejas!

Pruébalo tú mismo

package main

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

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

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

	// Lee el número de libros
	numBooksStr, _ := reader.ReadString('\n')
	numBooks, _ := strconv.Atoi(strings.TrimSpace(numBooksStr))

	// TODO: Lee los detalles de cada libro (ID, title, author, ISBN)
	// y añádelos a la biblioteca
	for i := 0; i < numBooks; i++ {
		// TODO: Lee el ID del libro
		// TODO: Lee el título del libro
		// TODO: Lee el autor del libro
		// TODO: Lee el ISBN del libro
		// TODO: Crea el libro y añádelo a la biblioteca
	}

	// Lee el número de usuarios
	numUsersStr, _ := reader.ReadString('\n')
	numUsers, _ := strconv.Atoi(strings.TrimSpace(numUsersStr))

	// TODO: Lee los detalles de cada usuario (ID, name, email)
	// y añádelos a la biblioteca
	for i := 0; i < numUsers; i++ {
		// TODO: Lee el ID del usuario
		// TODO: Leer el nombre del usuario
		// TODO: Leer el email del usuario
		// TODO: Crear el usuario y añadirlo a la biblioteca
	}

	// TODO: Convertir la biblioteca a JSON e imprimirla
	fmt.Println(library.ToJSON())
}

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de Go online