مقدمة في العمل مع JSON في Go
JSON (JavaScript Object Notation) هو أحد أشهر تنسيقات تبادل البيانات في تطبيقات الويب الحديثة، والخدمات المصغرة، وواجهات API. توفر لغة Go (Golang) دعمًا مدمجًا وقويًا للعمل مع JSON من خلال حزمة encoding/json. تتيح هذه الحزمة تحويل البيانات بسهولة بين هياكل Go وسلاسل JSON، والعكس صحيح.
في هذه المقالة، سنشرح بالتفصيل كيفية إجراء التحليل (إلغاء التسلسل) والتسلسل لـ JSON في Go. ستتعلم كيفية العمل مع الهياكل البسيطة والمتداخلة، ومعالجة الأخطاء، وتخصيص أسماء الحقول. ستكون المادة مفيدة لكل من المبتدئين والمطورين ذوي الخبرة الذين يرغبون في تنظيم معرفتهم.
أساسيات التسلسل (Marshal) في Go
تحويل هيكل Go إلى JSON
التسلسل هو عملية تحويل كائن Go (مثل هيكل أو شريحة) إلى سلسلة JSON. لهذا الغرض، تُستخدم الدالة json.Marshal(). لنلقِ نظرة على مثال بسيط:
package main
import ( "encoding/json" "fmt")
type User struct { Name string Age int Email string}
func main() { user := User{ Name: "إيفان بيتروف", Age: 30, Email: "ivan@example.com", }
jsonData, err := json.Marshal(user) if err != nil { fmt.Println("خطأ في التسلسل:", err) return }
fmt.Println(string(jsonData))}مخرجات البرنامج:
{"Name":"إيفان بيتروف","Age":30,"Email":"ivan@example.com"}لاحظ أن أسماء الحقول في JSON تطابق أسماء حقول الهيكل. لكن غالبًا ما يكون من الضروري تغييرها، على سبيل المثال، لجعلها بنمط camelCase. لهذا الغرض، تُستخدم وسوم الهياكل.
استخدام الوسوم لتخصيص JSON
تسمح وسوم الهياكل بتحديد كيفية تسلسل الحقل بالضبط. دعنا نضيف وسومًا إلى مثالنا:
type User struct { Name string `json:"name"` Age int `json:"age"` Email string `json:"email,omitempty"`}الآن سيكون المخرج كالتالي:
{"name":"إيفان بيتروف","age":30,"email":"ivan@example.com"}الخيارات الرئيسية للوسوم:
json:"field_name"— يحدد اسم الحقل في JSON.omitempty— يستبعد الحقل من JSON إذا كانت قيمته صفرية (سلسلة فارغة، 0، false، nil).-— يتجاهل الحقل تمامًا أثناء التسلسل/إلغاء التسلسل.
تسلسل الشرائح والخرائط
تعمل حزمة encoding/json بشكل ممتاز ليس فقط مع الهياكل، ولكن أيضًا مع الشرائح والخرائط والأنواع البسيطة:
// شريحة من الهياكلusers := []User{ {Name: "آنا", Age: 25}, {Name: "بوريس", Age: 35},}jsonUsers, _ := json.Marshal(users)fmt.Println(string(jsonUsers))// المخرج: [{"name":"آنا","age":25},{"name":"بوريس","age":35}]
// خريطةdata := map[string]interface{}{ "status": "ok", "count": 42,}jsonMap, _ := json.Marshal(data)fmt.Println(string(jsonMap))// المخرج: {"count":42,"status":"ok"}تحليل JSON (Unmarshal) في Go
التحليل الأساسي إلى هيكل
إلغاء التسلسل (التحليل) هو العملية العكسية: تحويل سلسلة JSON إلى كائن Go. تُستخدم الدالة json.Unmarshal(). مهم: يجب أن يكون الهيكل الهدف مُصدرًا (الحقول بأحرف كبيرة) أو أن يكون له وسوم مناسبة.
jsonString := `{"name":"ماريا","age":28,"email":"maria@example.com"}`
var user Usererr := json.Unmarshal([]byte(jsonString), &user)if err != nil { fmt.Println("خطأ في التحليل:", err) return}
fmt.Printf("الاسم: %s, العمر: %d", user.Name, user.Age)// المخرج: الاسم: ماريا, العمر: 28تحليل الهياكل المتداخلة
غالبًا ما يحتوي JSON على كائنات متداخلة. ```