في 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