JSON إلى بنية Go

التالي

الصق عينة JSON واحصل على تعريفات بنية Go تحلّلها بنظافة عبر encoding/json. تكون الحقول مصدَّرة (CamelCase)، وموسومة بمفاتيح JSON الأصلية، ومرفوعة إلى مؤشرات حين قد تكون القيمة null، وتنال الكائنات المتداخلة تعريفات بنية مسمّاة خاصة بها.

كيف تحوّل JSON إلى بنية Go

  1. 1

    الصق JSON

    عينة واحدة تكفي. العينات المتعددة تحسّن استنتاج القيم القابلة لـ null.

  2. 2

    اختر التسمية

    PascalCase للحقول المصدَّرة هو عرف Go. اختر نمط الاختصار (`URL` مقابل `Url`، `ID` مقابل `Id`).

  3. 3

    اختر استراتيجية الاختياري

    استخدم مؤشرات للحقول القابلة لـ null (الأكثر اصطلاحا)، أو وسوم `omitempty`.

  4. 4

    انسخ البنى

    بنية جذر واحدة إضافة إلى المتداخلة. الصقها في ملف `.go` واضغط `go build`.

مثال على الناتج

لـ:

{ "first_name": "Alice", "age": 30, "email": null, "tags": ["admin"] }

الناتج:

type User struct {
    FirstName string   `json:"first_name"`
    Age       int      `json:"age"`
    Email     *string  `json:"email"`
    Tags      []string `json:"tags"`
}

تعيين الأنواع

قيمة JSON نوع Go
سلسلة نصية string
عدد صحيح int أو int64
عدد (عشري) float64
قيمة منطقية bool
null (مع شقيق غير null) *T (مؤشر)
مصفوفة []T
كائن بنية مسمّاة
مصفوفة مختلطة []interface{}

اصطلاحات التسمية التي يتبعها المولّد

  • الأحرف الأولية بأحرف كبيرة: id -> ID، url -> URL، api_key -> APIKey. يطابق هذا أسلوب Go الموصى به (وقواعد go vet / staticcheck).
  • JSON بنمط snake_case -> حقول PascalCase: first_name -> FirstName.
  • اختصارات الكلمة الواحدة محفوظة: يبقى IP هو IP، ويبقى HTTP هو HTTP.
  • وسم JSON: يحفظ json:"first_name" المفتاح الأصلي كي يدور الترميز ذهابا وإيابا بنظافة.

الحقول الاختيارية: مؤشر أم omitempty؟

الاستراتيجية استخدمها حين
مؤشر (*T) تحتاج التمييز بين “غائب” و“قيمة صفرية“
omitempty تريد فقط تخطّي القيم الصفرية عند الترميز؛ يخزّن فك الترميز صفرا للمفقود
لا هذا ولا ذاك الحقل حاضر دائما والقيم الصفرية ذات معنى

يفترض المولّد مؤشر + omitempty لأي شيء يُرى null؛ اضبط بحسب دلالاتك.

أخطاء شائعة

  • استخدام int حيث يتجاوز عدد JSON الصحيح MaxInt32 على هدف 32 بت. استخدم int64 للقيم المعلومة الكبر.
  • إعادة الترميز وفقدان ترتيب المفاتيح. يصدر encoding/json المفاتيح بترتيب تصريح الحقول، لا بترتيب JSON الأصلي. رتّب يدويا إن احتجت ناتجا قانونيا.
  • المصفوفات مختلطة الشكل. يفقد []interface{} أمان النوع. فكّر في أنواع اتحاد بحقل مميِّز type بدلا من ذلك.
  • نسيان omitempty على الاختياريات. بدونه، تُسلسَل الحقول الاختيارية كـ "foo": null بدل حذفها.

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

استخدم المؤشرات حين تحتاج التمييز بين “الحقل غائب” و“الحقل صفري“. استخدم omitempty حين لا تكون القيمة الصفرية قيمة عمل مشروعة (""، 0، false تعني دائما “تخطَّ هذا”). تختار فرق كثيرة واحدة وتطبّقها باتساق عبر قاعدة الشيفرة.

يصبح كل كائن متداخل تعريف بنية مسمّاة منفصلا (مثل User -> Address). تُضمَّن الأنواع فقط حين تكون البنية المتداخلة صغيرة جدا وتُستخدم مرة؛ وإلا تحصل على أنواع نظيفة قابلة لإعادة الاستخدام.

نعم. يصبح id هو ID، وurl هو URL، وapi_key هو APIKey. هذا ما يتوقعه go vet وما توصي به معظم أدلة أسلوب Go.

يصدر المولّد بنى عادية بوسوم json: قياسية. أما تطبيقات UnmarshalJSON المخصصة (مثلا لتواريخ بصيغ غير ISO)، فأضِفها يدويا بعد التوليد.

أدوات ذات صلة

الأداة متاحة بلغات أخرى