مقدمة في العمل مع JSON في Go
\n\nJSON (JavaScript Object Notation) هو أحد أشهر صيغ تبادل البيانات في تطبيقات الويب الحديثة والخدمات المصغرة. بفضل بساطته وسهولة قراءته، أصبح JSON معيارًا لواجهات REST API وملفات التهيئة وتخزين البيانات المهيكلة.
\n\nتقدم لغة Go (Golang) دعمًا مدمجًا قويًا لـ JSON من خلال حزمة encoding/json. تتيح هذه الحزمة تحويل هياكل Go بسهولة إلى JSON (تسلسل) والعكس (إلغاء التسلسل أو التحليل).
في هذه المقالة، سنستعرض أساسيات العمل مع JSON في Go: من الأمثلة البسيطة إلى معالجة الهياكل المتداخلة المعقدة والأخطاء. المحتوى موجه للمطورين المبتدئين الذين هم على دراية بأساسيات بناء جملة Go.
\n\nالتسلسل: تحويل هياكل Go إلى JSON
\n\nالتسلسل (الترميز) هو عملية تحويل البيانات من التمثيل الداخلي لـ Go (هياكل، شرائح، خرائط) إلى سلسلة JSON. في Go، تُستخدم الدالة json.Marshal() لهذا الغرض.
مثال أساسي للتسلسل
\n\npackage 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().
إخراج منسق باستخدام json.MarshalIndent
\n\nللتصحيح أو الإخراج بشكل قابل للقراءة، استخدم json.MarshalIndent():
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\npackage 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 من تعديل حقوله.
تحليل إلى map[string]interface{}
\n\nإذا كان هيكل البيانات غير معروف مسبقًا، يمكن استخدام النوع العام:
\n\njsonString := `{"name":"آنا","