Menu
CoddyTech

Lapisan Persistensi JSON

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GO di Coddy. Pelajaran 102 dari 107.

challenge icon

Tantangan

Mudah

Mari tambahkan persistensi data ke Sistem Manajemen Perpustakaan kita! Kamu akan mengimplementasikan lapisan persistensi JSON yang dapat mengubah data perpustakaanmu ke format JSON untuk disimpan, lalu memuatnya kembali dari string JSON. Ini penting bagi aplikasi nyata yang perlu mempertahankan data antar sesi.

Kamu akan mengatur kodemu dalam lima file:

  • book.go: Struct Book milikmu dengan tag struct JSON untuk mengatur serialisasi. Setiap field harus memiliki tag JSON yang sesuai: id, title, author, isbn, dan available. Sertakan constructor NewBook.
  • user.go: Struct User milikmu dengan tag struct JSON untuk id, name, email, dan borrowed_books. Sertakan constructor NewUser.
  • data.go: Buat struct LibraryData yang berfungsi sebagai object transfer untuk serialisasi JSON. Struct ini harus memiliki dua field: Books (slice pointer ke Book) dan Users (slice pointer ke User), masing-masing dengan tag JSON yang sesuai (books dan users).
  • library.go: Struct Library milikmu dengan map untuk buku dan pengguna. Tambahkan dua method baru:
    • ToJSON(): mengubah data perpustakaan menjadi string JSON berformat menggunakan json.MarshalIndent dengan indentasi dua spasi. Method ini harus mengumpulkan semua buku dan pengguna dari map ke dalam struct LibraryData, lalu menserialisasikannya.
    • FromJSON(jsonStr string): menerima string JSON, membatalkan serialisasinya ke dalam struct LibraryData, lalu mengisi map perpustakaan dengan buku dan pengguna yang dimuat.
  • main.go: Peragakan lapisan persistensi dengan membuat perpustakaan dan mengubahnya menjadi JSON.

    Baca jumlah buku, lalu baca ID, judul, penulis, dan ISBN setiap buku. Berikutnya, baca jumlah pengguna, lalu baca ID, nama, dan email setiap pengguna. Setelah mengisi perpustakaan, panggil ToJSON() dan cetak string JSON yang dihasilkan.

Input berikut akan diberikan:

  • Jumlah buku, lalu ID, judul, penulis, dan ISBN setiap buku (masing-masing pada baris terpisah)
  • Jumlah pengguna, lalu ID, nama, dan email setiap pengguna (masing-masing pada baris terpisah)

Contohnya, dengan input:

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

Outputmu harus:

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

Dan dengan input:

1
B100
Design Patterns
Gang of Four
978-0201633610
0

Outputmu harus:

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

Penting: Saat melakukan iterasi pada map untuk membuat slice, tambahkan buku dengan urutan: B001, B002, dan seterusnya (diurutkan berdasarkan ID secara alfabetis), begitu pula dengan pengguna. Ini memastikan output JSON konsisten. Kamu dapat menggunakan sort.Strings pada key map sebelum melakukan iterasi.

Struct LibraryData menjembatani penyimpanan berbasis map dengan format berbasis array milik JSON. Pola object transfer ini umum digunakan saat menserialisasi struktur data yang kompleks!

Coba sendiri

package main

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

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

	// Buat library baru
	library := NewLibrary()

	// Baca jumlah buku
	numBooksStr, _ := reader.ReadString('\n')
	numBooks, _ := strconv.Atoi(strings.TrimSpace(numBooksStr))

	// TODO: Baca detail setiap buku (ID, judul, penulis, ISBN)
	// dan tambahkan ke library
	for i := 0; i < numBooks; i++ {
		// TODO: Baca ID buku
		// TODO: Baca judul buku
		// TODO: Baca penulis buku
		// TODO: Baca ISBN buku
		// TODO: Buat buku dan tambahkan ke library
	}

	// Baca jumlah pengguna
	numUsersStr, _ := reader.ReadString('\n')
	numUsers, _ := strconv.Atoi(strings.TrimSpace(numUsersStr))

	// TODO: Baca detail setiap pengguna (ID, nama, email)
	// dan tambahkan ke library
	for i := 0; i < numUsers; i++ {
		// TODO: Baca ID pengguna
		// TODO: Baca nama pengguna
		// TODO: Baca email pengguna
		// TODO: Buat pengguna dan tambahkan ke library
	}

	// TODO: Ubah library menjadi JSON dan cetak hasilnya
	fmt.Println(library.ToJSON())
}

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Go online