गो में, जब एम्बेडेड फ़ील्ड के साथ एक संरचना में JSON डेटा को अनमर्शल किया जाता है, तो किसी को समस्या आ सकती है यदि एम्बेडेड संरचना इसे परिभाषित करती है स्वयं की UnmarshalJSON विधि। ऐसा इसलिए है क्योंकि JSON लाइब्रेरी एम्बेडेड स्ट्रक्चर के अनमर्शलJSON को कॉल करती है और युक्त स्ट्रक्चर में परिभाषित फ़ील्ड को अनदेखा करती है।
निम्न स्ट्रक्चर परिभाषा पर विचार करें:
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.Unmarshal(data, &Outer{}) का उपयोग करके JSON को आउटर में अनमर्शल किया जाता है, तो इनर फ़ील्ड संपूर्ण JSON स्ट्रिंग का उपभोग करते हुए, अपनी UnmarshalJSON विधि को ट्रिगर करता है। इसके कारण आउटर में Num फ़ील्ड को अनदेखा कर दिया जाता है।
इस समस्या को हल करने के लिए, एम्बेडेड स्ट्रक्चर इनर को आउटर में एक स्पष्ट फ़ील्ड में परिवर्तित करें:
type Outer struct {
I Inner // make Inner an explicit field
Num int `json:"Num"`
}
इनर को एक स्पष्ट फ़ील्ड बनाकर, आप यह सुनिश्चित करते हैं कि JSON लाइब्रेरी डेटा को न्यूम फ़ील्ड सहित आउटर के उपयुक्त फ़ील्ड में अनमर्शल कर देती है।
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