Menu
Coddy logo textTech

שכבת התמדה עם JSON

חלק מהיחידה תכנות מונחה עצמים במסלול ה-GO של Coddy. שיעור 102 מתוך 107.

challenge icon

אתגר

קל

נוסיף התמדה של נתונים למערכת ניהול הספרייה שלנו! תממשו שכבת התמדה של JSON שיכולה להמיר את נתוני הספרייה שלכם לפורמט JSON לשמירה, ולטעון אותם בחזרה ממחרוזות JSON. זה חיוני לכל יישום אמיתי שצריך לשמר נתונים בין הפעלות.

תארגנו את הקוד שלכם בחמישה קבצים:

  • book.go: המבנה Book שלכם עם תגיות JSON למבנה, כדי לשלוט בסריאליזציה. לכל שדה צריכה להיות תגית JSON מתאימה: id, title, author, isbn ו-available. כללו את הבנאי NewBook שלכם.
  • user.go: המבנה User שלכם עם תגיות JSON למבנה עבור id,‏ name,‏ email ו-borrowed_books. כללו את הבנאי NewUser שלכם.
  • data.go: צרו מבנה LibraryData שמשמש כאובייקט העברה לסריאליזציה של JSON. צריכים להיות לו שני שדות: Books (פרוסה של מצביעים ל-Book) ו-Users (פרוסה של מצביעים ל-User), כל אחד עם תגיות JSON מתאימות (books ו-users).
  • library.go: המבנה Library שלכם עם מפות לספרים ולמשתמשים. הוסיפו שתי מתודות חדשות:
    • ToJSON(): ממירה את נתוני הספרייה למחרוזת JSON מעוצבת באמצעות json.MarshalIndent עם הזחה של שני רווחים. עליה לאסוף את כל הספרים והמשתמשים מהמפות לתוך מבנה LibraryData, ואז לבצע סריאליזציה שלו.
    • FromJSON(jsonStr string): מקבלת מחרוזת JSON, מבצעת לה unmarshaling לתוך מבנה LibraryData, וממלאת את מפות הספרייה בספרים ובמשתמשים שנטענו.
  • main.go: הדגימו את שכבת ההתמדה באמצעות בניית ספרייה והמרתה ל-JSON.

    קראו את מספר הספרים, ואז עבור כל ספר קראו את המזהה שלו, הכותרת, המחבר וה-ISBN. לאחר מכן, קראו את מספר המשתמשים, ועבור כל משתמש קראו את המזהה שלו, השם וכתובת הדוא"ל. לאחר מילוי הספרייה, קראו ל-ToJSON() והדפיסו את מחרוזת ה-JSON שהתקבלה.

הקלטים הבאים יסופקו:

  • מספר הספרים, ואז המזהה, הכותרת, המחבר וה-ISBN של כל ספר (כל אחד בשורה נפרדת)
  • מספר המשתמשים, ואז המזהה, השם וכתובת הדוא"ל של כל משתמש (כל אחד בשורה נפרדת)

לדוגמה, עבור:

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

הפלט שלכם צריך להיות:

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

ועבור:

1
B100
Design Patterns
Gang of Four
978-0201633610
0

הפלט שלכם צריך להיות:

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

חשוב: כשאתם עוברים על המפות כדי לבנות את הפרוסות, הוסיפו ספרים לפי הסדר: B001,‏ B002 וכן הלאה (ממוינים לפי מזהה בסדר אלפביתי), וכך גם לגבי המשתמשים. כך תבטיחו פלט JSON עקבי. תוכלו להשתמש ב-sort.Strings על מפתחות המפה לפני המעבר עליהם.

המבנה LibraryData מגשר על הפער בין האחסון שלכם המבוסס על מפות לבין הפורמט של JSON המבוסס על מערכים. תבנית אובייקט ההעברה הזו נפוצה בעת סריאליזציה של מבני נתונים מורכבים!

נסו בעצמכם

package main

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

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

	// צור ספרייה חדשה
	library := NewLibrary()

	// קרא את מספר הספרים
	numBooksStr, _ := reader.ReadString('\n')
	numBooks, _ := strconv.Atoi(strings.TrimSpace(numBooksStr))

	// TODO: קרא את הפרטים של כל ספר (ID, כותרת, מחבר, ISBN)
	// והוסף אותם לספרייה
	for i := 0; i < numBooks; i++ {
		// TODO: קרא את ה-ID של הספר
		// TODO: קרא את כותרת הספר
		// TODO: קרא את שם מחבר הספר
		// TODO: קרא את ה-ISBN של הספר
		// TODO: צור ספר והוסף אותו לספרייה
	}

	// קרא את מספר המשתמשים
	numUsersStr, _ := reader.ReadString('\n')
	numUsers, _ := strconv.Atoi(strings.TrimSpace(numUsersStr))

	// TODO: קרא את הפרטים של כל משתמש (ID, שם, דוא״ל)
	// והוסף אותם לספרייה
	for i := 0; i < numUsers; i++ {
		// TODO: קרא את ה-ID של המשתמש
		// TODO: קרא את שם המשתמש
		// TODO: קרא את כתובת האימייל של המשתמש
		// TODO: צור משתמש והוסף אותו לספרייה
	}

	// TODO: המר את הספרייה ל-JSON והדפס אותה
	fmt.Println(library.ToJSON())
}

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר Go אונליין