العمل مع JSON في Go: التحليل والتسلسل للمبتدئين

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

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

ابدأ الدورة

مقدمة في العمل مع JSON في Go

\n\n

JSON (JavaScript Object Notation) هو أحد أشهر صيغ تبادل البيانات في تطبيقات الويب الحديثة والخدمات المصغرة. بفضل بساطته وسهولة قراءته، أصبح JSON معيارًا لواجهات REST API وملفات التهيئة وتخزين البيانات المهيكلة.

\n\n

تقدم لغة Go (Golang) دعمًا مدمجًا قويًا لـ JSON من خلال حزمة encoding/json. تتيح هذه الحزمة تحويل هياكل Go بسهولة إلى JSON (تسلسل) والعكس (إلغاء التسلسل أو التحليل).

\n\n

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

\n\n

التسلسل: تحويل هياكل Go إلى JSON

\n\n

التسلسل (الترميز) هو عملية تحويل البيانات من التمثيل الداخلي لـ Go (هياكل، شرائح، خرائط) إلى سلسلة JSON. في Go، تُستخدم الدالة json.Marshal() لهذا الغرض.

\n\n

مثال أساسي للتسلسل

\n\n
package main\n\nimport (\n    "encoding/json"\n    "fmt"\n)\n\ntype Person struct {\n    Name string\n    Age  int\n    City string\n}\n\nfunc main() {\n    person := Person{\n        Name: "إيفان بيتروف",\n        Age:  30,\n        City: "موسكو",\n    }\n\n    jsonBytes, err := json.Marshal(person)\n    if err != nil {\n        fmt.Println("خطأ في التسلسل:", err)\n        return\n    }\n\n    fmt.Println(string(jsonBytes))\n    // الإخراج: {"Name":"إيفان بيتروف","Age":30,"City":"موسكو"}\n}
\n\n

لاحظ: json.Marshal() يُرجع شريحة من البايتات ([]byte)، لذا نقوم بتحويلها إلى سلسلة باستخدام string().

\n\n

إخراج منسق باستخدام json.MarshalIndent

\n\n

للتصحيح أو الإخراج بشكل قابل للقراءة، استخدم json.MarshalIndent():

\n\n
jsonBytes, err := json.MarshalIndent(person, "", "  ")\nif err != nil {\n    fmt.Println("خطأ:", err)\n    return\n}\nfmt.Println(string(jsonBytes))\n// الإخراج:\n// {\n//   "Name": "إيفان بيتروف",\n//   "Age": 30,\n//   "City": "موسكو"\n// }
\n\n

تسلسل الشرائح والخرائط

\n\n

تسمح Go بتسلسل ليس فقط الهياكل، بل أيضًا أنواع البيانات الأخرى:

\n\n
// شريحة من الهياكل\npeople := []Person{\n    {Name: "آنا", Age: 25, City: "سانت بطرسبرغ"},\n    {Name: "بيتر", Age: 35, City: "قازان"},\n}\njsonBytes, _ := json.Marshal(people)\nfmt.Println(string(jsonBytes))\n// الإخراج: [{"Name":"آنا","Age":25,"City":"سانت بطرسبرغ"},{"Name":"بيتر","Age":35,"City":"قازان"}]\n\n// خريطة\nscores := map[string]int{"الجبر": 5, "الفيزياء": 4, "المعلوماتية": 5}\njsonBytes, _ = json.Marshal(scores)\nfmt.Println(string(jsonBytes))\n// الإخراج: {"الجبر":5,"المعلوماتية":5,"الفيزياء":4}
\n\n

تحليل JSON: تحويل JSON إلى هياكل Go

\n\n

التحليل (إلغاء التسلسل) هو العملية العكسية: من سلسلة JSON نحصل على هيكل Go. تُستخدم الدالة json.Unmarshal() لهذا الغرض.

\n\n

تحليل إلى هيكل

\n\n
package main\n\nimport (\n    "encoding/json"\n    "fmt"\n)\n\ntype Person struct {\n    Name string\n    Age  int\n    City string\n}\n\nfunc main() {\n    jsonString := `{"Name":"إيفان بيتروف","Age":30,"City":"موسكو"}`\n\n    var person Person\n    err := json.Unmarshal([]byte(jsonString), &person)\n    if err != nil {\n        fmt.Println("خطأ في التحليل:", err)\n        return\n    }\n\n    fmt.Printf("الاسم: %s، العمر: %d، المدينة: %s\\n", person.Name, person.Age, person.City)\n    // الإخراج: الاسم: إيفان بيتروف، العمر: 30، المدينة: موسكو\n}
\n\n

هام: قم بتمرير مؤشر إلى الهيكل (&person)، وإلا فلن يتمكن Unmarshal من تعديل حقوله.

\n\n

تحليل إلى map[string]interface{}

\n\n

إذا كان هيكل البيانات غير معروف مسبقًا، يمكن استخدام النوع العام:

\n\n
jsonString := `{"name":"آنا","                

المدونات

توصيات الكتب