العمل مع JSON في Go: التحليل والتسلسل عمليًا
\n\nJSON (JavaScript Object Notation) هو أحد أكثر تنسيقات تبادل البيانات شيوعًا في تطوير الويب. في لغة Go (Golang)، يتم العمل مع JSON من خلال الحزمة القياسية encoding/json، التي توفر أدوات قوية وسهلة الاستخدام للتسلسل (تحويل هياكل البيانات إلى JSON) وإلغاء التسلسل (تحليل JSON إلى هياكل Go). في هذه المقالة، سنشرح بالتفصيل كيفية العمل مع JSON في Go من خلال أمثلة عملية.
الأساسيات: تسلسل الهياكل إلى JSON
\n\nالطريقة الأكثر شيوعًا للعمل مع JSON في Go هي استخدام الهياكل مع الوسوم (tags). تسمح الوسوم بتحديد أسماء الحقول في JSON، والتي قد تختلف عن أسماء الحقول في Go. لنلقِ نظرة على مثال أساسي للتسلسل:
\n\npackage main\n\nimport (\n "encoding/json"\n "fmt"\n)\n\ntype User struct {\n ID int `json:"id"`\n Name string `json:"name"`\n Email string `json:"email"`\n IsActive bool `json:"is_active"`\n}\n\nfunc main() {\n user := User{\n ID: 1,\n Name: "إيفان بيتروف",\n Email: "ivan@example.com",\n IsActive: true,\n }\n\n jsonData, err := json.Marshal(user)\n if err != nil {\n fmt.Println("خطأ في التسلسل:", err)\n return\n }\n\n fmt.Println(string(jsonData))\n // الإخراج: {"id":1,"name":"إيفان بيتروف","email":"ivan@example.com","is_active":true}\n}\n\nلاحظ: نستخدم الوسوم json:"اسم_الحقل" للتحكم في أسماء المفاتيح في JSON. هذا مفيد بشكل خاص عندما تحتاج إلى الالتزام بمعايير تسمية معينة (مثل snake_case في JSON وCamelCase في Go).
تحليل JSON إلى هياكل Go
\n\nيتم إلغاء التسلسل (تحليل) بيانات JSON إلى هياكل باستخدام الدالة json.Unmarshal. من المهم أن يتطابق الهيكل مع بنية كائن JSON. لنكمل مع مثالنا:
func main() {\n jsonString := `{"id":2,"name":"ماريا سيدوروفا","email":"maria@example.com","is_active":false}`\n\n var user User\n err := json.Unmarshal([]byte(jsonString), &user)\n if err != nil {\n fmt.Println("خطأ في التحليل:", err)\n return\n }\n\n fmt.Printf("ID: %d, Name: %s, Email: %s, Active: %t\\n",\n user.ID, user.Name, user.Email, user.IsActive)\n // الإخراج: ID: 2, Name: ماريا سيدوروفا, Email: maria@example.com, Active: false\n}\n\nهام: يتم دائمًا تمرير مؤشر إلى الهيكل (&user) إلى الدالة json.Unmarshal، وإلا فلن يتم حفظ التغييرات.
التعامل مع الهياكل المتداخلة والمصفوفات
\n\nغالبًا ما تحتوي بيانات JSON الحقيقية على كائنات ومصفوفات متداخلة. تتيح Go معالجة هذه الحالات بأناقة باستخدام الهياكل المتداخلة:
\n\ntype Address struct {\n City string `json:"city"`\n Street string `json:"street"`\n ZipCode string `json:"zip_code"`\n}\n\ntype Employee struct {\n ID int `json:"id"`\n Name string `json:"name"`\n Skills []string `json:"skills"`\n Address Address `json:"address"`\n}\n\nfunc main() {\n jsonData := `{\n "id": 101,\n "name": "أليكسي إيفانوف",\n "skills": ["Go", "Python", "Docker"],\n "address": {\n "city": "موسكو",\n "street": "تفيرسكايا، 10",\n "zip_code": "101000"\n }\n }`\n\n var emp Employee\n err := json.Unmarshal([]byte(jsonData), &emp)\n if err != nil {\n fmt.Println("خطأ:", err)\n return\n }\n\n fmt.Printf("الموظف: %s، المدينة: %s، المهارات: %v\\n",\n emp.Name, emp.Address.City, emp.Skills)\n // الإخراج: الموظف: أليكسي إيفانوف، المدينة: موسكو، المهارات: [Go Python Docker]\n}\n\nللمصفوفات في Go، نستخدم الشرائح ([]string)، وللكائنات المتداخلة نستخدم هياكل منفصلة. عند تحليل مصفوفة من الكائنات في JSON، يمكن