Menu
Coddy logo textTech

Camada de Persistência JSON

Parte da seção Programação Orientada a Objetos do Journey de GO da Coddy — lição 102 de 107.

challenge icon

Desafio

Fácil

Vamos adicionar persistência de dados ao nosso Sistema de Gerenciamento de Biblioteca! Você implementará uma camada de persistência JSON que pode converter os dados da sua biblioteca para o formato JSON para salvar, e carregá-los de volta a partir de strings JSON. Isso é essencial para qualquer aplicação real que precise preservar dados entre sessões.

Você organizará seu código em cinco arquivos:

  • book.go: Sua struct Book com tags de struct JSON para controlar a serialização. Cada campo deve ter uma tag JSON correspondente: id, title, author, isbn, e available. Inclua seu construtor NewBook.
  • user.go: Sua struct User com tags de struct JSON para id, name, email, e borrowed_books. Inclua seu construtor NewUser.
  • data.go: Crie uma struct LibraryData que atue como um objeto de transferência para serialização JSON. Ela deve ter dois campos: Books (um slice de ponteiros para Book) e Users (um slice de ponteiros para User), cada um com as tags JSON apropriadas (books e users).
  • library.go: Sua struct Library com maps para livros e usuários. Adicione dois novos métodos:
    • ToJSON() — converte os dados da biblioteca em uma string JSON formatada usando json.MarshalIndent com indentação de dois espaços. Ele deve coletar todos os livros e usuários dos maps em uma struct LibraryData e, em seguida, serializá-la.
    • FromJSON(jsonStr string) — recebe uma string JSON, faz o unmarshal em uma struct LibraryData e popula os maps da biblioteca com os livros e usuários carregados.
  • main.go: Demonstre a camada de persistência construindo uma biblioteca e convertendo-a para JSON.

    Leia o número de livros, então, para cada livro, leia seu ID, título, autor e ISBN. Em seguida, leia o número de usuários e, para cada usuário, leia seu ID, nome e e-mail. Após popular a biblioteca, chame ToJSON() e imprima a string JSON resultante.

As seguintes entradas serão fornecidas:

  • Número de livros, depois o ID, título, autor e ISBN de cada livro (cada um em linhas separadas)
  • Número de usuários, depois o ID, nome e e-mail de cada usuário (cada um em linhas separadas)

Por exemplo, dado:

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

Sua saída deve 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": []
    }
  ]
}

E dado:

1
B100
Design Patterns
Gang of Four
978-0201633610
0

Sua saída deve ser:

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

Importante: Ao iterar sobre os maps para construir seus slices, adicione os livros na ordem: B001, B002, etc. (ordenados por ID alfabeticamente) e os usuários de forma semelhante. Isso garante uma saída JSON consistente. Você pode usar sort.Strings nas chaves do map antes de iterar.

A struct LibraryData faz a ponte entre o seu armazenamento baseado em maps e o formato baseado em arrays do JSON. Este padrão de objeto de transferência é comum ao serializar estruturas de dados complexas!

Experimente você mesmo

package main

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

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

	// Criar uma nova biblioteca
	library := NewLibrary()

	// Ler o número de livros
	numBooksStr, _ := reader.ReadString('\n')
	numBooks, _ := strconv.Atoi(strings.TrimSpace(numBooksStr))

	// TODO: Ler os detalhes de cada livro (ID, title, author, ISBN)
	// e adicioná-los à biblioteca
	for i := 0; i < numBooks; i++ {
		// TODO: Ler o ID do livro
		// TODO: Ler o title do livro
		// TODO: Ler o author do livro
		// TODO: Ler o ISBN do livro
		// TODO: Criar o livro e adicionar à biblioteca
	}

	// Ler o número de usuários
	numUsersStr, _ := reader.ReadString('\n')
	numUsers, _ := strconv.Atoi(strings.TrimSpace(numUsersStr))

	// TODO: Ler os detalhes de cada usuário (ID, name, email)
	// e adicioná-los à biblioteca
	for i := 0; i < numUsers; i++ {
		// TODO: Ler o ID do usuário
		// TODO: Ler o name do usuário
		// TODO: Ler o email do usuário
		// TODO: Criar o usuário e adicionar à biblioteca
	}

	// TODO: Converter a biblioteca para JSON e imprimi-la
	fmt.Println(library.ToJSON())
}

Todas as lições de Programação Orientada a Objetos