العمل مع JSON في Go: التحليل والتسلسل عمليًا

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

العمل مع JSON في Go: التحليل والتسلسل عمليًا

\n\n

JSON (JavaScript Object Notation) هو أحد أكثر تنسيقات تبادل البيانات شيوعًا في تطوير الويب. في لغة Go (Golang)، يتم العمل مع JSON من خلال الحزمة القياسية encoding/json، التي توفر أدوات قوية وسهلة الاستخدام للتسلسل (تحويل هياكل البيانات إلى JSON) وإلغاء التسلسل (تحليل JSON إلى هياكل Go). في هذه المقالة، سنشرح بالتفصيل كيفية العمل مع JSON في Go من خلال أمثلة عملية.

\n\n

الأساسيات: تسلسل الهياكل إلى JSON

\n\n

الطريقة الأكثر شيوعًا للعمل مع JSON في Go هي استخدام الهياكل مع الوسوم (tags). تسمح الوسوم بتحديد أسماء الحقول في JSON، والتي قد تختلف عن أسماء الحقول في Go. لنلقِ نظرة على مثال أساسي للتسلسل:

\n\n
package 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).

\n\n

تحليل JSON إلى هياكل Go

\n\n

يتم إلغاء التسلسل (تحليل) بيانات JSON إلى هياكل باستخدام الدالة json.Unmarshal. من المهم أن يتطابق الهيكل مع بنية كائن JSON. لنكمل مع مثالنا:

\n\n
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

التعامل مع الهياكل المتداخلة والمصفوفات

\n\n

غالبًا ما تحتوي بيانات JSON الحقيقية على كائنات ومصفوفات متداخلة. تتيح Go معالجة هذه الحالات بأناقة باستخدام الهياكل المتداخلة:

\n\n
type 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، يمكن

المدونات

توصيات الكتب