Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

طبقة حفظ البيانات 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، وتفك تسلسلها إلى بنية 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, title, author, ISBN)
	// وأضفها إلى المكتبة
	for i := 0; i < numBooks; i++ {
		// TODO: اقرأ ID الكتاب
		// TODO: اقرأ title الكتاب
		// TODO: اقرأ author الكتاب
		// TODO: اقرأ ISBN الكتاب
		// TODO: أنشئ كتابًا وأضفه إلى المكتبة
	}

	// اقرأ عدد المستخدمين
	numUsersStr, _ := reader.ReadString('\n')
	numUsers, _ := strconv.Atoi(strings.TrimSpace(numUsersStr))

	// TODO: اقرأ تفاصيل كل مستخدم (ID, name, email)
	// وأضفها إلى المكتبة
	for i := 0; i < numUsers; i++ {
		// TODO: اقرأ ID المستخدم
		// TODO: اقرأ اسم المستخدم
		// TODO: اقرأ البريد الإلكتروني للمستخدم
		// TODO: أنشئ مستخدمًا وأضفه إلى المكتبة
	}

	// TODO: حوّل المكتبة إلى JSON واطبعها
	fmt.Println(library.ToJSON())
}

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Go عبر الإنترنت