معالجة JSON في Go (Golang): دليل شامل مع أمثلة

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

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

ابدأ الدورة

معالجة JSON في Go (Golang): دليل شامل



Go (Golang) هي لغة برمجة مترجمة حديثة، تم تطويرها في Google. من نقاط قوتها الرئيسية الدعم المدمج لتنسيق JSON من خلال الحزمة القياسية encoding/json. على عكس العديد من اللغات الأخرى التي تتطلب تثبيت مكتبات خارجية، فإن معالجة JSON في Go متاحة "مباشرة" وتتميز بأداء عالٍ وكتابة صارمة.



في هذه المقالة، سنشرح بالتفصيل جميع جوانب العمل مع JSON في Go: من التحليل البسيط إلى السيناريوهات المعقدة مع الأنواع المخصصة والمعالجة التدفقية.



الأساسيات: ترميز وفك ترميز JSON



توفر الحزمة encoding/json وظيفتين رئيسيتين: json.Marshal() لتسلسل هياكل Go إلى JSON و json.Unmarshal() لإلغاء تسلسل JSON مرة أخرى إلى هياكل.



مثال: تسلسل هيكل إلى JSON



package main

import ( "encoding/json" "fmt")

type User struct { Name string `json:"name"` Age int `json:"age"` Email string `json:"email,omitempty"`}

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 إلى هيكل



func main() {    jsonString := `{"name":"آنا سميرنوفا","age":25,"email":"anna@example.com"}`        var user User    err := json.Unmarshal([]byte(jsonString), &user)    if err != nil {        fmt.Println("خطأ في إلغاء التسلسل:", err)        return    }

fmt.Printf("الاسم: %s، العمر: %d، البريد الإلكتروني: %s", user.Name, user.Age, user.Email)}


وسوم الهياكل (Struct Tags)



تسمح وسوم الهياكل في Go بالتحكم في كيفية تسلسل الحقول إلى JSON. هذه آلية قوية لتخصيص أسماء الحقول، وتخطي القيم الفارغة، وخيارات أخرى.



الخيارات الأساسية للوسوم:



  • json:"name" — يحدد اسم الحقل في JSON
  • json:"-" — يستبعد الحقل تمامًا من JSON
  • json:"name,omitempty" — يتخطى الحقل إذا كان يحتوي على قيمة صفرية (0، ""، false، nil)
  • json:"name,string" — يحول الحقل الرقمي إلى سلسلة نصية إجباريًا


مثال مع وسوم مختلفة:



type Product struct {    ID          int     `json:"id"`    Title       string  `json:"title"`    Description string  `json:"description,omitempty"`    Price       float64 `json:"price,string"`    SecretKey   string  `json:"-"`}

func main() { product := Product{ ID: 101, Title: "لابتوب", Description: "", Price: 899.99, SecretKey: "sk-12345", }

jsonData, _ := json.MarshalIndent(product, "", " ") fmt.Println(string(jsonData)) // الإخراج: // { // "id": 101, // "title": "لابتوب", // "price": "899.99" // }}


العمل مع بيانات JSON عشوائية (interface{})



أحيانًا يكون هيكل بيانات JSON غير معروف مسبقًا. في هذه الحالات، يمكن استخدام النوع interface{} أو map[string]interface{}.



func main() {    jsonString := `{"name":"اختبار","values":[1,2,3],"active":true,"metadata":{"version":2}}`        var data map[string]interface{}    err := json.Unmarshal([]byte(jsonString), &data)    if err != nil {        fmt.Println("خطأ:", err)        return    }

// الوصول إلى القيم مع تحويل الأنواع name := data["name"].(string) values := data["values"].([]interface{})

توصيات