JSON إلى Go Struct

توليد structs في Go من JSON

جرب مثالاً
اسم struct الجذر:

إدخال JSON

مخرجات Go

يعمل محليًا · آمن للصق الأسرار
ستظهر structs في Go هنا…

ما هو تحويل JSON إلى Go Struct؟

تحويل JSON إلى Go يحوّل بيانات JSON الخام إلى تعريفات أنواع Go التي تعمل مع حزمة encoding/json في المكتبة القياسية للغة. Go لغة ذات أنواع ثابتة، لذا يحتاج كل حقل JSON إلى حقل struct مقابل بالنوع الصحيح ووسم struct يخبر المُسلسِل بمفتاح JSON الذي يجب ربطه. كتابة هذه التعريفات يدويًا لاستجابات API الكبيرة أو المتداخلة بعمق أمر بطيء وعرضة للأخطاء.

تستخدم حزمة encoding/json، المُعرَّفة في مواصفات Go منذ الإصدار 1.0، الانعكاس لمطابقة مفاتيح JSON بحقول struct المُصدَّرة. المطابقة غير حساسة لحالة الأحرف بشكل افتراضي، لكن وسوم struct الصريحة هي الممارسة المعيارية لأنها تُزيل الغموض وتتيح لك استخدام أسلوب PascalCase في Go بينما يبقى JSON بصيغة camelCase أو snake_case. يُؤتمِت المحوّل هذه العملية: يقرأ JSON الخاص بك، ويستنتج أنواع Go من القيم، ويُخرج تعريفات struct بالوسوم الصحيحة.

يتوافق نظام الأنواع في Go بدقة مع JSON. تصبح السلاسل النصية string، والقيم المنطقية bool، والأعداد الصحيحة int، والأعداد العشرية float64. تصبح كائنات JSON المتداخلة structs مسمّاة منفصلة، وتصبح المصفوفات شرائح (slices). الاستثناء الوحيد هو null: لا يوجد في Go نوع nullable عام، لذا تصبح قيم null عادةً أنواع مؤشرات (*string, *int) أو interface{}. يتعامل المولّد مع كل هذا في أجزاء من الثانية.

لماذا تستخدم محوّل JSON إلى Go؟

تعريف structs في Go من JSON يدويًا يعني عدّ الأقواس وتخمين الأنواع وإعادة كتابة الوسوم في كل مرة تتغير فيها الواجهة البرمجية. يُزيل المحوّل هذا الاحتكاك.

توليد الأنواع فورًا
الصق JSON واحصل على تعريفات struct صحيحة في Go في أقل من ثانية. بدون كتابة حقول يدويًا، ولا وسوم منسية، ولا متاعب في المحاذاة.
🔒
معالجة تحافظ على خصوصيتك
يعمل التحويل بالكامل في متصفحك. لا تغادر بيانات JSON جهازك أبدًا، فتبقى مفاتيح API والرموز المميزة وبيانات المستخدمين طيّ الكتمان.
🏷️
وسوم struct صحيحة
يتضمن كل حقل مولَّد وسم struct من نوع json يربط اسم حقل Go بمفتاح JSON الأصلي. هذا يمنع حالات عدم التطابق الصامتة أثناء json.Unmarshal.
📦
بدون تثبيت أو تسجيل
افتح الصفحة والصق JSON. لا تلزمك سلسلة أدوات Go، ولا أدوات CLI للتثبيت، ولا حساب للإنشاء.

حالات استخدام تحويل JSON إلى Go

تطوير عملاء REST API
ولّد structs الطلبات والاستجابات لواجهات REST البرمجية التابعة لجهات خارجية. الصق JSON النموذجي من توثيق API واحصل على أنواع جاهزة للاستخدام مع http.Client وjson.NewDecoder.
نماذج gRPC Gateway
عندما تُعرّض خدمة Go نقاط نهاية gRPC وREST معًا، تحتاج إلى structs في Go تطابق حمولات JSON. حوّل شكل JSON إلى structs تطابق تعريفات protobuf الخاصة بك.
تحليل إعدادات DevOps
حلّل ملفات إعداد JSON (مخرجات Terraform ومانيفستات Kubernetes وإعدادات خطوط CI/CD) إلى structs ذات أنواع محددة في Go لأدوات مخصصة وبرامج نصية للأتمتة.
معالجة خطوط البيانات
أنشئ structs في Go لسجلات JSON من طوابير الرسائل (Kafka وRabbitMQ وSQS) أو بحيرات البيانات. تكتشف الـ structs ذات الأنواع المحددة تغييرات المخطط في وقت التصريف بدلًا من وقت التشغيل.
إعداد بيانات الاختبار
حوّل بيانات اختبار JSON إلى structs في Go لاختبارات جدول-مدفوعة. تجعل البيانات المأمونة من حيث الأنواع تشخيص أعطال الاختبار أسهل من تأكيدات map[string]interface{} الخام.
تعلّم نظام الأنواع في Go
يستطيع الطلاب والمطورون القادمون من اللغات الديناميكية لصق JSON مألوف ورؤية كيف يُمثّل Go البيانات ذاتها بأنواع صريحة ومؤشرات ووسوم struct.

جدول تعيين أنواع JSON إلى Go

تتبع حزمة encoding/json قواعد محددة عند تعيين قيم JSON إلى أنواع Go. يوضح الجدول أدناه التعيين الافتراضي والبدائل الشائعة. عمود "الافتراضي" هو ما تنتجه معظم المولّدات. يوضح عمود "البديل" الأنواع التي قد تختارها بناءً على متطلباتك، كـint64 للمعرّفات الكبيرة أو أنواع المؤشرات للحقول القابلة للإلغاء.

نوع JSONمثالالافتراضيالبديل
string"hello"stringstring
number (integer)42intint64
number (float)3.14float64float64
booleantrueboolbool
nullnullinterface{}*string / *int
object{"k": "v"}structstruct
array of strings["a", "b"][]string[]string
array of objects[{"id": 1}][]Item[]Item
mixed array[1, "a"][]interface{}[]interface{}

مرجع وسوم struct في Go لـ JSON

تتحكم وسوم struct في كيفية تسلسل وإلغاء تسلسل الحقول بواسطة encoding/json. وسم json هو الأكثر استخدامًا إلى حد بعيد، لكن يمكنك دمجه مع وسوم أخرى (db وyaml وxml) على الحقل ذاته. صياغة الوسم عبارة عن سلسلة محاطة بعلامات backtick بعد نوع الحقل. فيما يلي خيارات وسم json التي تدعمها encoding/json.

الوسمالسلوكحالة الاستخدام
json:"name"Maps struct field to JSON key "name"Always generated
json:"name,omitempty"Omits field from output if zero valueOptional fields
json:"-"Field is never serialized or deserializedInternal fields
json:"name,string"Encodes int/bool as JSON stringString-encoded numbers

json.Unmarshal مقابل json.NewDecoder

توفر Go طريقتين لفكّ ترميز JSON: json.Unmarshal للشرائح byte وjson.NewDecoder لتدفقات io.Reader. كلتاهما تستخدمان قواعد وسوم struct ذاتها، لكنهما تختلفان في متى يُستخدم كل منهما.

json.Unmarshal
تأخذ []byte وتملأ struct. الأنسب لـ JSON الموجود بالكامل في الذاكرة: أجسام استجابات HTTP المقروءة بـio.ReadAll، ومحتويات الملفات، وبيانات الاختبار. تُعيد خطأً إذا كان JSON مشوّهًا أو لم تتطابق الأنواع.
json.NewDecoder
تُغلّف io.Reader وتفكّ ترميز رموز JSON عند وصولها. الأنسب للمصادر المتدفقة: أجسام استجابات HTTP المقروءة مباشرةً، وسجلات JSON المفصولة بسطر جديد (NDJSON)، أو الملفات الكبيرة التي لا تريد تحميلها بالكامل في الذاكرة. استدعِ Decode()‎ في حلقة مع More()‎ لتدفقات متعددة الكائنات.

أمثلة برمجية

تُوضح هذه الأمثلة كيفية استخدام structs في Go المولَّدة من JSON في برامج فعلية، إضافةً إلى كيفية توليدها من لغات أخرى. تستخدم أمثلة Go حزمة encoding/json من المكتبة القياسية.

Go (json.Unmarshal)
package main

import (
	"encoding/json"
	"fmt"
)

type User struct {
	ID       int      `json:"id"`
	Name     string   `json:"name"`
	Email    string   `json:"email"`
	IsActive bool     `json:"is_active"`
	Tags     []string `json:"tags"`
}

func main() {
	data := []byte(`{"id":1,"name":"Alice","email":"alice@example.com","is_active":true,"tags":["admin","editor"]}`)

	var user User
	if err := json.Unmarshal(data, &user); err != nil {
		panic(err)
	}
	fmt.Println(user.Name)  // → Alice
	fmt.Println(user.Tags)  // → [admin editor]
}
JavaScript (fetch + type reference)
// JSON response from API — this is the shape you'd convert to Go:
const res = await fetch("https://api.example.com/users/1");
const user = await res.json();
// user → { "id": 1, "name": "Alice", "email": "alice@example.com" }

// Equivalent Go struct:
// type User struct {
//     ID    int    `json:"id"`
//     Name  string `json:"name"`
//     Email string `json:"email"`
// }
Python (generate Go structs from JSON)
import json

def json_to_go(data: dict, name: str = "Root") -> str:
    lines = [f"type {name} struct {{"]
    type_map = {str: "string", int: "int", float: "float64", bool: "bool"}

    for key, value in data.items():
        go_type = type_map.get(type(value), "interface{}")
        field = key.title().replace("_", "")  # snake_case → PascalCase
        lines.append(f'\t{field} {go_type} `json:"{key}"`')
    lines.append("}")
    return "\n".join(lines)

data = json.loads('{"user_name": "Alice", "age": 30, "verified": true}')
print(json_to_go(data))
# type Root struct {
#     UserName string `json:"user_name"`
#     Age      int    `json:"age"`
#     Verified bool   `json:"verified"`
# }
Go (json.Decoder for streams)
package main

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

type Event struct {
	Type    string `json:"type"`
	Payload string `json:"payload"`
}

func main() {
	stream := strings.NewReader(`{"type":"click","payload":"btn-1"}
{"type":"scroll","payload":"page-2"}`)

	dec := json.NewDecoder(stream)
	for dec.More() {
		var ev Event
		if err := dec.Decode(&ev); err != nil {
			break
		}
		fmt.Printf("%s: %s\n", ev.Type, ev.Payload)
	}
	// → click: btn-1
	// → scroll: page-2
}

الأسئلة الشائعة

ما الفرق بين json.Unmarshal وjson.Decode؟
تأخذ json.Unmarshal مصفوفة []byte تحتوي على مستند JSON كاملًا وتملأ struct. تُغلّف json.NewDecoder مصدر io.Reader وتفكّك ترميز JSON بشكل تدريجي. استخدم Unmarshal عندما يكون لديك JSON الكامل في الذاكرة بالفعل (مثلًا بعد io.ReadAll). استخدم NewDecoder عند القراءة مباشرةً من جسم استجابة HTTP أو ملف أو أي مصدر متدفق تريد تجنب تخزين الحمولة الكاملة في الذاكرة.
كيف تتعامل Go مع حقول JSON المفقودة من الحمولة؟
تترك حقول JSON المفقودة حقل struct المقابل في Go عند قيمته الصفرية: "" للسلاسل النصية، و0 للأرقام، وfalse للقيم المنطقية، وnil للمؤشرات والشرائح. إذا كنت بحاجة إلى التمييز بين "الحقل مفقود" و"الحقل موجود لكن صفري"، استخدم نوع مؤشر مثل *int أو *string. المؤشر nil يعني أن الحقل كان غائبًا؛ أما المؤشر غير nil ذو قيمة صفرية فيعني أنه كان مضبوطًا صراحةً على 0 أو "".
لماذا يجب أن تكون حقول struct في Go مُصدَّرة (بحرف كبير) لـ JSON؟
تستخدم حزمة encoding/json الانعكاس للوصول إلى حقول struct، وقواعد الانعكاس في Go تسمح فقط بالوصول إلى الحقول المُصدَّرة (بحرف كبير). إذا بدأ حقل بحرف صغير، لا تستطيع encoding/json رؤيته وستتخطاه بصمت أثناء التسلسل وإلغائه. استخدم وسم struct من نوع json لربط حقل PascalCase مُصدَّر بمفتاح JSON بحرف صغير.
كيف أتعامل مع مفاتيح JSON بصيغة snake_case في Go؟
أضف وسم struct من نوع json يحمل اسم مفتاح JSON الدقيق. مثلًا، يُعيَّن حقل JSON "user_name" إلى حقل Go UserName بالوسم `json:"user_name"`. يتولى المولّد هذا الأمر تلقائيًا. لا يوجد خيار عام في encoding/json لضبط سياسة التسمية؛ يجب أن يُعلن كل حقل وسمه الخاص.
هل يمكن تحويل JSON الذي يحتوي على قيم null إلى Go؟
نعم. تُعيَّن قيم null في JSON إلى أنواع مؤشرات في Go. حقل مثل "age": null يصبح Age *int `json:"age"`. عندما تكون قيمة JSON هي null، يكون مؤشر Go هو nil. وعندما تحمل قيمةً، تُخصّص Go عددًا صحيحًا ويُشير إليه المؤشر. بالنسبة للحقول القابلة للإلغاء دائمًا، استخدام المؤشر هو النهج الأسلوبي في Go.
ماذا يحدث إذا احتوى JSON على عدد أكبر مما يستوعبه int في Go؟
نوع int في Go يعتمد على المنصة (32 بت على الأنظمة 32 بت، و64 بت على الأنظمة 64 بت). للأرقام الكبيرة مثل طوابع وقت JavaScript أو معرّفات قواعد البيانات، استخدم int64 صراحةً. إذا كان للعدد في JSON منازل عشرية، استخدم float64. للأرقام التي تتجاوز دقة float64 (مثل القيم المالية الكبيرة)، استخدم json.Number الذي يحتفظ بتمثيل السلسلة النصية الخام ويتيح لك تحليله بنفسك.
ما الفرق بين هذه الأداة في المتصفح وأداة json-to-go السطرية؟
تحوّل هذه الأداة في المتصفح JSON إلى تعريفات struct في Go فورًا دون تثبيت أي شيء. أما أداة json-to-go السطرية (المتاحة عبر go install) فتؤدي الغرض ذاته من سطر الأوامر، وهو ما يناسب الأتمتة والبرامج النصية وخطوط CI. كلتاهما تنتجان structs صالحة في Go بوسوم struct لـencoding/json. استخدم أداة المتصفح للتحويلات السريعة غير المنتظمة، والأداة السطرية للاستخدام البرمجي أو ضمن خطوط المعالجة.