"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيفية التعامل مع الهياكل المضمنة باستخدام UnmarshalJSON المخصص في Go؟

كيفية التعامل مع الهياكل المضمنة باستخدام UnmarshalJSON المخصص في Go؟

تم النشر بتاريخ 2024-11-09
تصفح:135

How to Handle Embedded Structs with Custom UnmarshalJSON in Go?

معالجة الأخطاء: إلغاء التنظيم المخصص للهياكل المضمنة

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

دراسة حالة

ضع في اعتبارك تعريف البنية التالي:

type Outer struct {
    Inner
    Num int
}

type Inner struct {
    Data string
}

func (i *Inner) UnmarshalJSON(data []byte) error {
    i.Data = string(data)
    return nil
}

عند إلغاء تنظيم JSON إلى الخارج باستخدام json.Unmarshal(data, &Outer{})، يقوم الحقل الداخلي بتشغيل أسلوب UnmarshalJSON الخاص به، مما يستهلك سلسلة JSON بأكملها. يؤدي هذا إلى تجاهل الحقل Num في Outer.

الحل: الحقل الصريح

لحل هذه المشكلة، قم بتحويل البنية المضمنة Inner إلى حقل صريح في Outer:

type Outer struct {
    I Inner // make Inner an explicit field
    Num int `json:"Num"`
}

من خلال جعل Inner حقلًا صريحًا، فإنك تضمن أن مكتبة JSON تقوم بإلغاء تنظيم البيانات في الحقول الخارجية المناسبة، بما في ذلك حقل Num.

مثال

import (
    "encoding/json"
    "fmt"
)

type Outer struct {
    I Inner // make Inner an explicit field
    Num int `json:"Num"`
}

type Inner struct {
    Data string
}

func (i *Inner) UnmarshalJSON(data []byte) error {
    i.Data = string(data)
    return nil
}

func main() {
    data := []byte(`{"Data": "Example", "Num": 42}`)
    var outer Outer
    err := json.Unmarshal(data, &outer)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(outer.I.Data, outer.Num) // Output: Example 42
}
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3