JSON إلى struct في Go

أنشئ تعريفات struct في Go من JSON

نبذة عن JSON إلى struct في Go

تحول أداة JSON إلى struct في Go عينة JSON أو JSON Schema إلى تعريفات أنواع في Go لحزمة encoding/json، ينشئها quicktype-core داخل متصفحك. يصبح كل كائن متداخل تعريف struct مستقلا باسمه، وتتبع أسماء الحقول أسلوب Go بما في ذلك الاختصارات (user_id يصبح UserID)، ويحتفظ كل حقل بالمفتاح الأصلي في وسم json، وفي كل وسم آخر تذكره في «الوسوم»، مثل yaml أو db. الأعداد الصحيحة من نوع int64، والأعداد المكتوبة بفاصلة عشرية من نوع float64. عندما تلصق مصفوفة، يصبح المفتاح الذي لا يوجد إلا في بعض العناصر مؤشرا مع omitempty؛ ويضيفه «omitempty في كل حقل» إلى كل الحقول، ويحول «مؤشرات إلى struct المتداخلة» حقلا مثل Address إلى ‎*Address. افتراضيا، لا يحتوي المخرج إلا على تعريفات الأنواع: املأ «الحزمة» ليبدأ بتصريح الحزمة، واختر «الأنواع ودوال Unmarshal / Marshal» في «الكود» للحصول أيضا على دالة Unmarshal ودالة Marshal والدوال التي تفك ترميز قيمة لها نوعان. يمكن لصق JSON أو فتحه من ملف ‎.json أو ‎.txt.

مثال

كائن فيه عنوان متداخل: يحصل العنوان على تعريف struct خاص به.

مدخل JSON

{"user_id": 42, "score": 9.5, "tags": ["go", "api"], "address": {"city": "Montreal", "zip": "H2X"}}

مخرج struct في Go

type Root struct {
	UserID  int64    `json:"user_id"`
	Score   float64  `json:"score"`
	Tags    []string `json:"tags"`
	Address Address  `json:"address"`
}

type Address struct {
	City string `json:"city"`
	Zip  string `json:"zip"`
}

كيفية تحويل JSON إلى struct في Go

  1. 1الصق JSON، مثل استجابة من واجهة API، في «مدخل JSON»، أو انقر على «فتح ملف» لتحميل ملف ‎.json أو ‎.txt. لاستخدام JSON Schema، اختر «JSON Schema» في «المصدر».
  2. 2اكتب «اسم النوع»، و«الحزمة» إذا أردت تصريح حزمة؛ ثم اختر «الكود» و«الوسوم» والخانات التي تحتاجها.
  3. 3انقر على «تحويل» لإنشاء تعريفات struct في «مخرج struct في Go».
  4. 4انقر على «نسخ»، أو على «تنزيل» للحصول على الملف «model.go».

الصيغ والحدود

الإدخال
نص JSON، أو JSON Schema، ملصق أو مفتوح من ملف ‎.json أو ‎.txt؛ مع المصفوفة، تدمج حقول كل العناصر
الإخراج
تعريفات struct في Go مع وسوم json والوسوم التي تذكرها، محفوظة في model.go؛ مع تصريح حزمة ودوال Unmarshal / Marshal إذا اخترتها
أنواع الأرقام
int64 للأعداد الصحيحة؛ float64 للأعداد المكتوبة بفاصلة عشرية أو بأس، مثل 10.0
التواريخ
string افتراضيا؛ وtime.Time عند تحديد «التواريخ بالنوع time.Time» وكانت القيمة تاريخا ووقتا بصيغة ISO 8601 مثل ‎2024-05-01T10:00:00Z، وكذلك لـ "format": "date-time" في JSON Schema
المفاتيح الاختيارية
نوع مؤشر مع omitempty عندما يغيب المفتاح عن بعض العناصر؛ مؤشر وحده عندما تكون قيمته null في بعضها؛ ‎interface{}‎ عندما تكون قيمته null في كل العينة
الأنواع المختلطة
المفتاح الذي يحمل رقما في عنصر ونصا في عنصر آخر يصبح struct فيه حقلا مؤشر Integer وString؛ ولا تستطيع encoding/json ملأه إلا بالدالة UnmarshalJSON التي يضيفها «الأنواع ودوال Unmarshal / Marshal»

أين يعالج نص JSON الخاص بك

يجري إنشاء تعريفات struct في علامة التبويب هذه من المتصفح. يحمل محرك quicktype مرة واحدة، عند نقرتك الأولى، ويبقى نص JSON على حاسوبك. لكن الصفحة ترسل تقارير الأخطاء: عندما يظهر سطر خطأ أحمر، يرسل نصه، بعد حذف المقاطع المقتبسة والأرقام الطويلة والعناوين منه، إلى سجل الأخطاء لدينا مع اسم الأداة واسم متصفحك وإصداره، ويبلغ عن أي عطل غير متوقع في الصفحة بالطريقة نفسها.

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

هل يصبح الحقل مؤشرا عندما يغيب المفتاح أحيانا أو تكون قيمته null؟

نعم. المفتاح الغائب عن عنصر واحد على الأقل يصبح مؤشرا مع omitempty، الذي يحذفه عند الترميز؛ والمفتاح الذي قيمته null في أحد العناصر يصبح مؤشرا بسيطا، دون omitempty. إذا كان المفتاح موجودا دائما في بياناتك الحقيقية، فاستبدل ‎*string بـ string يدويا.

ما أنواع الأرقام التي تستخدمها الأداة؟

int64 للأعداد الصحيحة وfloat64 للأعداد العشرية. القيمة المكتوبة 10.0 تحسب عددا عشريا، فتصبح float64، وتبقى قيمة 10.5 تصل لاحقا قابلة لفك الترميز. انتقل بنفسك إلى int أو int32 إذا كانت قيمك صغيرة.

كيف تسمي الأداة الحقول الآتية من مفاتيح بصيغة snake_case؟

تحولها إلى أسماء Go مصدرة وتحتفظ بالمفتاح في الوسم: user_id يصبح UserID، ويبقى وسمه user_id، فتقرأ encoding/json المفتاح الأصلي وتكتبه دون تغيير.

هل يمكنها إنشاء struct لمصفوفة JSON؟

نعم. المصفوفة في المستوى الأعلى تعطي type Root []RootElement، وتدمج حقول كل العناصر في RootElement، فيكفي عنصر واحد بلا مفتاح ما ليصبح ذلك المفتاح اختياريا.

هل يمكنها كتابة تصريح الحزمة ودالة Unmarshal؟

نعم. اكتب اسم الحزمة في «الحزمة»، مثل main أو model، ليبدأ الكود بتصريحها. اختر «الأنواع ودوال Unmarshal / Marshal» في «الكود» للحصول أيضا على دالة تقرأ JSON، مثل UnmarshalRoot(data)، ودالة Marshal، وعبارات import التي تحتاجها، ودالتي UnmarshalJSON وMarshalJSON لقيمة لها نوعان؛ وهذا الاختيار يتطلب اسم حزمة.

هل يمكنني إضافة omitempty إلى كل حقل، أو وسوم غير json؟

نعم. حدد «omitempty في كل حقل» لتحذف القيم الفارغة عند الترميز. اذكر مفاتيح وسوم أخرى في «الوسوم»، مفصولة بفواصل، مثل json,yaml أو json,db: يحصل كل حقل عندئذ على وسم لكل مفتاح، وكل وسم بالمفتاح الأصلي.

هل يمكنني البدء من JSON Schema؟

نعم. اختر «JSON Schema» في «المصدر»، ثم الصق المخطط أو افتحه. تأتي الأنواع والخصائص الإلزامية (وتصبح الأخرى مؤشرات مع omitempty) وتعدادات enum (نوع string مع ثوابته) وتنسيقات date-time (time.Time) من المخطط. لا يتبع المرجع ‎$ref‎ إلا داخل المستند (‎#/definitions/‎… أو ‎#/$defs/‎…): لا ينزل أبدا مخطط موجود في عنوان آخر، وتذكر الصفحة ذلك.

نصائح وحيل

  • ✓الصق عنصرين أو ثلاثة مختلفة من قائمة API بدلا من عنصر واحد، حتى تصبح المفاتيح الغائبة أحيانا مؤشرات.
  • ✓حدد «مؤشرات إلى struct المتداخلة» عندما تحتاج إلى التمييز بين كائن غائب (nil) وكائن فارغ.