معالجة JSON في Go (Golang): encoding/json والبدائل

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

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

ابدأ الدورة

معالجة JSON في Go (Golang): من الأساسيات إلى التقنيات المتقدمة



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



1. الأساسيات: المكتبة القياسية encoding/json



في Go، تتم معالجة JSON عبر الحزمة encoding/json. العمليات الأساسية هي التسلسل (تحويل إلى JSON) وإلغاء التسلسل (تحويل من JSON).



1.1. التسلسل (struct → JSON)



لتحويل هيكل Go إلى JSON، تُستخدم الدالة json.Marshal():



package main

import ( "encoding/json" "fmt" "log")

type User struct { Name string `json:"name"` Age int `json:"age"` Email string `json:"email,omitempty"` // omitempty - تخطي إذا كان فارغًا}

func main() { user := User{ Name: "إيفان بيتروف", Age: 30, Email: "ivan@example.com", }

jsonData, err := json.Marshal(user) if err != nil { log.Fatal(err) }

fmt.Println(string(jsonData)) // {"name":"إيفان بيتروف","age":30,"email":"ivan@example.com"}}


هام: يجب أن تكون حقول الهيكل قابلة للتصدير (بحرف كبير). تتحكم الوسوم json:"fieldname" في تسمية الحقول في JSON.



1.2. إلغاء التسلسل (JSON → struct)



للتحويل العكسي، تُستخدم json.Unmarshal():



func main() {    jsonString := `{"name":"آنا","age":25,"email":"anna@mail.com"}`        var user User    err := json.Unmarshal([]byte(jsonString), &user)    if err != nil {        log.Fatal(err)    }

fmt.Printf("الاسم: %s، العمر: %d", user.Name, user.Age) // الاسم: آنا، العمر: 25}


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



غالبًا ما يحتوي JSON على كائنات ومصفوفات متداخلة. في Go، يتم تمثيل ذلك بهياكل وشرائح متداخلة:



type Address struct {    City    string `json:"city"`    Street  string `json:"street"`    ZipCode string `json:"zip_code"`}

type Company struct { Name string `json:"name"` Employees []User `json:"employees"` Address Address `json:"address"`}

func main() { companyJSON := `{ "name": "TechCorp", "employees": [ {"name":"أوليغ","age":28,"email":"oleg@tech.com"}, {"name":"ماريا","age":32,"email":"maria@tech.com"} ], "address": { "city": "موسكو", "street": "تفيرسكايا، 10", "zip_code": "101000" } }`

var company Company json.Unmarshal([]byte(companyJSON), &company) fmt.Printf("الشركة: %s، المدينة: %s، عدد الموظفين: %d", company.Name, company.Address.City, len(company.Employees))}


3. التقنيات المتقدمة



3.1. التسلسل المخصص (واجهات Marshaler/Unmarshaler)



أحيانًا تحتاج إلى التحكم في كيفية تحويل النوع إلى JSON. لتحقيق ذلك، يتم تنفيذ واجهات json.Marshaler و json.Unmarshaler:



type CustomTime struct {    time.Time}

const layout = "2006-01-02T15:04:05Z"

func (ct CustomTime) MarshalJSON() ([]byte, error) { return json.Marshal(ct.Format(layout))}

func (ct *CustomTime) UnmarshalJSON(data []byte) error { var s string if err := json.Unmarshal(data, &s); err != nil { return err } t, err := time.Parse(layout, s) if err != nil { return err } ct.Time = t return nil}

type Event struct { Title string `json:"title"` Date CustomTime `js

توصيات