مقدمة في العمل مع JSON في Go
JSON (JavaScript Object Notation) هو تنسيق خفيف لتبادل البيانات يُستخدم على نطاق واسع في تطوير الويب وواجهات برمجة التطبيقات (API) وملفات التكوين. توفر لغة Go (Golang) حزمة مدمجة encoding/json تتيح إجراء تحليل (فك الترميز) وتسلسل (ترميز) البيانات بسهولة. في هذه المقالة، سنشرح أساسيات العمل مع JSON في Go من خلال أمثلة عملية مفهومة حتى للمطورين المبتدئين.
أساسيات حزمة encoding/json
حزمة encoding/json هي مكتبة Go قياسية لا تتطلب تثبيتًا إضافيًا. الأداتان الرئيسيتان في هذه الحزمة هما الدالتان json.Marshal (للتسلسل) و json.Unmarshal (لإلغاء التسلسل).
الهياكل ووسوم JSON
في Go، يتم تمثيل البيانات عادةً على شكل هياكل (struct). للتحكم في أسماء الحقول في JSON، تُستخدم الوسوم. لنلقِ نظرة على مثال بسيط:
package main
import ( "encoding/json" "fmt")
// تعريف هيكل مع وسوم JSONtype Person struct { Name string `json:"name"` Age int `json:"age"` Email string `json:"email,omitempty"` IsAdmin bool `json:"is_admin"`}
func main() { // إنشاء مثيل للهيكل person := Person{ Name: "إيفان بيتروف", Age: 30, Email: "ivan@example.com", IsAdmin: true, } // تسلسل إلى JSON jsonData, _ := json.Marshal(person) fmt.Println(string(jsonData))}نتيجة التنفيذ:
{"name":"إيفان بيتروف","age":30,"email":"ivan@example.com","is_admin":true}نقاط مهمة:
- الوسم
json:"name"يحدد كيف سيُسمى الحقل في JSON - الخيار
omitemptyيتخطى الحقول الفارغة (القيم الصفرية) - يجب أن تكون حقول الهيكل قابلة للتصدير (تبدأ بحرف كبير)
تسلسل (Marshal) البيانات إلى JSON
التسلسل هو عملية تحويل هيكل Go أو أي نوع بيانات آخر إلى سلسلة JSON. الدالة json.Marshal تُرجع شريحة من البايتات ([]byte) ورسالة خطأ.
أمثلة على تسلسل أنواع مختلفة
package main
import ( "encoding/json" "fmt")
type Product struct { ID int `json:"id"` Name string `json:"name"` Price float64 `json:"price"` Tags []string `json:"tags,omitempty"` InStock bool `json:"in_stock"`}
func main() { // تسلسل هيكل product := Product{ ID: 101, Name: "لابتوب", Price: 79999.99, Tags: []string{"إلكترونيات", "لابتوبات"}, InStock: true, } // إخراج جميل مع مسافات بادئة jsonData, _ := json.MarshalIndent(product, "", " ") fmt.Println(string(jsonData)) // تسلسل شريحة من الهياكل products := []Product{ {ID: 1, Name: "فأرة", Price: 1500.00, InStock: true}, {ID: 2, Name: "لوحة مفاتيح", Price: 3500.00, InStock: false}, } jsonArray, _ := json.Marshal(products) fmt.Println(string(jsonArray))}النتيجة:
{ "id": 101, "name": "لابتوب", "price": 79999.99, "tags": [ "إلكترونيات", "لابتوبات" ], "in_stock": true}[{"id":1,"name":"فأرة","price":1500,"in_stock":true},{"id":2,"name":"لوحة مفاتيح","price":3500,"in_stock":false}]تحليل (Unmarshal) JSON في Go
التحليل هو العملية العكسية: تحويل سلسلة JSON إلى هيكل Go. لهذا تُستخدم الدالة json.Unmarshal.
مثال أساسي على التحليل
package main
import ( "encoding/json" "fmt" "log")
type User struct { Username string `json:"username"` Age