تنسيق JSON في Go: دليل شامل مع أمثلة عملية

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

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

ابدأ الدورة

لماذا يبدو JSON في Go وكأنه فوضى وكيف تصلح ذلك؟

هل سبق لك أن كتبت برنامجًا بلغة Go يقوم بإخراج JSON، وحصلت في الطرفية على شيء كهذا؟

{"name":"PythonLib","year":2025,"tags":["go","json","tutorial"],"active":true}

أتفق معك، قراءة هذا بدون أدوات خاصة ليست بالأمر الممتع. خاصة عندما تكون بنية البيانات معقدة والتداخل يمتد لعدة مستويات. تبدأ العيون في التشتت، ويصبح العثور على الحقل المطلوب مهمة شاقة.

الخبر السار: في Go هناك أدوات مدمجة تحول هذه "الفوضى" إلى مستند منظم ومرتب. واليوم سنستعرض جميع الطرق لتنسيق JSON بشكل جميل - من الاستخدام البسيط للمكتبة القياسية إلى إنشاء أداة pretty-print خاصة بك.

هذه المادة مبنية على سؤال حقيقي من Stack Overflow (أكثر من 50,000 مشاهدة)، مما يدل على أن الموضوع مطلوب بشدة. هيا بنا!

ما هو pretty-print ولماذا تحتاجه؟

Pretty-print (أو "الطباعة الجميلة") هو تنسيق البيانات باستخدام المسافات البادئة وفواصل الأسطر والمحاذاة، لتكون سهلة القراءة للبشر. في سياق JSON، هذا يعني:

  • إضافة مسافات أو علامات تبويب للعناصر المتداخلة
  • وضع كل زوج "مفتاح-قيمة" في سطر جديد
  • محاذاة القيم للوضوح

لماذا تحتاج هذا في Go؟ تخيل أنك تتصحح استجابة API، أو تكتب مسجل (logger)، أو ببساطة تعرض إعدادات. JSON غير المنسق يشغل مساحة أقل لكنه غير قابل للقراءة تمامًا. Pretty-print يحل هذه المشكلة ببضعة أسطر من الكود.

الطريقة 1: json.MarshalIndent — الحل القياسي

أبسط وأفضل طريقة هي استخدام الدالة json.MarshalIndent من الحزمة القياسية encoding/json. تقوم بالضبط بما هو مطلوب: تأخذ البيانات وتعيد JSON منسقًا بمسافات بادئة.

إليك مثال أساسي:

package main

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

type Site struct {
    Name   string   `json:"name"`
    Year   int      `json:"year"`
    Tags   []string `json:"tags"`
    Active bool     `json:"active"`
}

func main() {
    site := Site{
        Name:   "PythonLib",
        Year:   2025,
        Tags:   []string{"go", "json", "tutorial"},
        Active: true,
    }

    // البادئة — ""، المسافة البادئة — "  " (مسافتان)
    prettyJSON, err := json.MarshalIndent(site, "", "  ")
    if err != nil {
        log.Fatalf("خطأ في الترميز: %v", err)
    }

    fmt.Println(string(prettyJSON))
}

النتيجة:

{
  "name": "PythonLib",
  "year": 2025,
  "tags": [
    "go",
    "json",
    "tutorial"
  ],
  "active": true
}

جميل، أليس كذلك؟ لاحظ المعاملين الثاني والثالث للدالة MarshalIndent:

  • البادئة — سلسلة تضاف إلى بداية كل سطر. عادة ما تكون سلسلة فارغة "".
  • المسافة البادئة — سلسلة لكل مستوى تداخل. غالبًا ما تستخدم مسافتان " " أو علامة تبويب "\\t".

تخصيص المسافات البادئة: مسافات مقابل علامات تبويب

يمكنك بسهولة تغيير نمط المسافات البادئة. على سبيل المثال، باستخدام علامة التبويب:

prettyJSON, _ := json.MarshalIndent(site, "", "\\t")
fmt.Println(string(prettyJSON))

النتيجة:

{
	"name": "PythonLib",
	"year": 2025,
	"tags": [
		"go",
		"json",
		"tutorial"
	],
	"active": true
}

أي خيار تختار؟ إذا كان مشروعك يتبع معايير Go (التي توصي بعلامات التبويب للكود)، استخدم "\\t". إذا كنت تعمل في فريق يستخدم المسافات، فمسافتان ستكونان مناسبتين. الأهم هو الاتساق.

الطريقة 2: Pretty-print للنصوص JSON الخام

ماذا لو كان لديك بالفعل سلسلة نصية تحتوي على JSON غير منسق؟

المدونات

توصيات الكتب