معالجة 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"— يحدد اسم الحقل في JSONjson:"-"— يستبعد الحقل تمامًا من JSONjson:"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{})