Menu
Coddy logo textTech

JSON Kalıcılık Katmanı

Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 102 / 107.

challenge icon

Görev

Kolay

Kütüphane Yönetim Sistemimize veri kalıcılığı ekleyelim! Kütüphanenizin verilerini kaydetmek üzere JSON biçimine dönüştürebilen ve JSON dizelerinden geri yükleyebilen bir JSON kalıcılık katmanı uygulayacaksınız. Bu, oturumlar arasında verileri koruması gereken tüm gerçek uygulamalar için gereklidir.

Kodunuzu beş dosyaya ayıracaksınız:

  • book.go: Serileştirmeyi denetlemek için JSON struct etiketlerine sahip Book struct'ınız. Her alanın karşılık gelen bir JSON etiketi olmalıdır: id, title, author, isbn ve available. NewBook yapıcınızı ekleyin.
  • user.go: User, id, name ve email için JSON struct etiketlerine sahip borrowed_books struct'ınız. NewUser yapıcınızı ekleyin.
  • data.go: JSON serileştirmesi için aktarım nesnesi görevi gören bir LibraryData struct'ı oluşturun. Bu struct'ın iki alanı olmalıdır: Kitap işaretçilerinden oluşan bir dilim olan Books ve Kullanıcı işaretçilerinden oluşan bir dilim olan Users; her birinin uygun JSON etiketi (books ve users) bulunmalıdır.
  • library.go: Kitaplar ve kullanıcılar için map'lere sahip Library struct'ınız. İki yeni metot ekleyin:
    • ToJSON(): json.MarshalIndent kullanarak iki boşluklu girintiye sahip biçimlendirilmiş bir JSON dizesine dönüştürür. Map'lerdeki tüm kitapları ve kullanıcıları bir LibraryData struct'ında toplamalı, ardından bunları serileştirmelidir.
    • FromJSON(jsonStr string): Bir JSON dizesi alır, bunu bir LibraryData struct'ına dönüştürür ve kütüphanenin map'lerini yüklenen kitaplar ve kullanıcılarla doldurur.
  • main.go: Bir kütüphane oluşturarak ve onu JSON'a dönüştürerek kalıcılık katmanını gösterin.

    Kitap sayısını okuyun, ardından her kitap için ID'sini, başlığını, yazarını ve ISBN'sini okuyun. Sonra kullanıcı sayısını okuyun ve her kullanıcı için ID'sini, adını ve e-posta adresini okuyun. Kütüphaneyi doldurduktan sonra ToJSON() metodunu çağırın ve elde edilen JSON dizesini yazdırın.

Aşağıdaki girdiler sağlanacaktır:

  • Kitap sayısı, ardından her kitabın ID'si, başlığı, yazarı ve ISBN'si (her biri ayrı satırda)
  • Kullanıcı sayısı, ardından her kullanıcının ID'si, adı ve e-posta adresi (her biri ayrı satırda)

Örneğin, şu girdi verildiğinde:

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

Çıktınız şu şekilde olmalıdır:

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

Şu girdi verildiğinde:

1
B100
Design Patterns
Gang of Four
978-0201633610
0

Çıktınız şu şekilde olmalıdır:

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

Önemli: Dilimlerinizi oluşturmak için map'ler üzerinde yineleme yaparken kitapları şu sırayla ekleyin: B001, B002 vb. (ID'ye göre alfabetik olarak sıralanmış şekilde); kullanıcılar için de aynı işlemi uygulayın. Bu, tutarlı JSON çıktısı sağlar. Yineleme yapmadan önce map anahtarları üzerinde sort.Strings kullanabilirsiniz.

LibraryData struct'ı, map tabanlı depolamanız ile JSON'ın dizi tabanlı biçimi arasındaki boşluğu doldurur. Bu aktarım nesnesi deseni, karmaşık veri yapılarını serileştirirken yaygın olarak kullanılır!

Kendin dene

package main

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

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

	// Yeni bir kütüphane oluştur
	library := NewLibrary()

	// Kitap sayısını oku
	numBooksStr, _ := reader.ReadString('\n')
	numBooks, _ := strconv.Atoi(strings.TrimSpace(numBooksStr))

	// TODO: Her kitabın detaylarını oku (ID, title, author, ISBN)
	// ve bunları kütüphaneye ekle
	for i := 0; i < numBooks; i++ {
		// TODO: Kitap ID oku
		// TODO: Kitap title oku
		// TODO: Kitap author oku
		// TODO: Kitap ISBN oku
		// TODO: Kitap oluştur ve kütüphaneye ekle
	}

	// Kullanıcı sayısını oku
	numUsersStr, _ := reader.ReadString('\n')
	numUsers, _ := strconv.Atoi(strings.TrimSpace(numUsersStr))

	// TODO: Her kullanıcının detaylarını oku (ID, name, email)
	// ve bunları kütüphaneye ekle
	for i := 0; i < numUsers; i++ {
		// TODO: Kullanıcı ID oku
		// TODO: Kullanıcı adını oku
		// TODO: Kullanıcı e-postasını oku
		// TODO: Kullanıcı oluştur ve kütüphaneye ekle
	}

	// TODO: Kütüphaneyi JSON'a dönüştür ve yazdır
	fmt.Println(library.ToJSON())
}

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online Go derleyicisi