معالجة JSON في Go (Golang): من المكتبة القياسية إلى الأدوات المتقدمة
JSON (JavaScript Object Notation) هو أحد أشهر صيغ تبادل البيانات. في Go (Golang)، تم تنفيذ العمل مع JSON على أعلى مستوى بفضل المكتبة القياسية القوية encoding/json والعديد من الأدوات الخارجية التي تسرع وتبسط التطوير. في هذه المقالة، سنشرح بالتفصيل كيفية تسلسل وإلغاء تسلسل والتحقق من صحة وتحسين JSON في Go، بالإضافة إلى استعراض المكتبات الشائعة التي يجب أن يعرفها كل مطور Go.
المكتبة القياسية encoding/json
encoding/json هي حزمة مدمجة في Go توفر جميع الوظائف اللازمة للعمل مع JSON. الإمكانيات الرئيسية:
- التسلسل (Marshaling) — تحويل هياكل Go إلى سلسلة JSON.
- إلغاء التسلسل (Unmarshaling) — تحليل سلسلة JSON إلى هياكل Go.
- المعالجة التدفقية — قراءة/كتابة JSON من التدفقات (
io.Reader،io.Writer). - وسوم الهياكل — التحكم في أسماء الحقول، تخطي القيم الفارغة، التداخل.
مثال على التسلسل وإلغاء التسلسل
package main
import ( "encoding/json" "fmt" "log")
type User struct { ID int `json:"id"` Name string `json:"name"` Email string `json:"email"` IsActive bool `json:"is_active"`}
func main() { // تسلسل (هيكل -> JSON) user := User{ID: 1, Name: "أليكسي", Email: "alex@example.com", IsActive: true} jsonData, err := json.Marshal(user) if err != nil { log.Fatal(err) } fmt.Println(string(jsonData)) // الإخراج: {"id":1,"name":"أليكسي","email":"alex@example.com","is_active":true}
// إلغاء التسلسل (JSON -> هيكل) jsonStr := `{"id":2,"name":"ماريا","email":"maria@example.com","is_active":false}` var user2 User err = json.Unmarshal([]byte(jsonStr), &user2) if err != nil { log.Fatal(err) } fmt.Printf("%+v", user2) // الإخراج: {ID:2 Name:ماريا Email:maria@example.com IsActive:false}}العمل مع البيانات غير المهيكلة
أحيانًا يكون هيكل JSON غير معروف مسبقًا. في هذه الحالة، يمكن استخدام map[string]interface{} أو interface{}:
func main() { jsonStr := `{"name":"إيفان","age":30,"hobbies":["قراءة","رياضة"]}` var data map[string]interface{} err := json.Unmarshal([]byte(jsonStr), &data) if err != nil { log.Fatal(err) } fmt.Println(data["name"]) // إيفان fmt.Println(data["hobbies"].([]interface{})[0]) // قراءة}المكتبات الخارجية الشائعة
على الرغم من أن encoding/json يغطي معظم المهام، إلا أنه للأنظمة عالية التحميل أو السيناريوهات المحددة، يجدر النظر في البدائل:
1. easyjson
easyjson — مولد كود للتسلسل/إلغاء التسلسل السريع. يقوم بإنشاء دوال محسنة لهياكلك، مما يعطي زيادة في الأداء بمقدار 2–5 مرات مقارنة بالمكتبة القياسية.
- يتطلب توليد الكود عبر
easyjson. - يدعم الأنواع المخصصة والتداخل.
- مثالي للخدمات المصغرة ذات معدل الطلبات العالي (RPS).
//go:generate easyjson -all user.gotype User struct { ID int `json:"id"` Name string `json:"name"`}
// بعد التوليد نستخدم: user.MarshalJSON() / user.UnmarshalJSON()2. gjson
gjson — مكتبة للقراءة السريعة لـ JSON دون إلغاء تسلسل كامل. تسمح بالحصول على القيم حسب المسار (مشابه لـ jq):
import "github.com/tidwall/gjson"
func main() { json := `{"user":{"name":"أولغا","age":25}}` name :=