"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > गो में कस्टम अनमर्शलजेएसओएन के साथ एंबेडेड स्ट्रक्चर्स को कैसे संभालें?

गो में कस्टम अनमर्शलजेएसओएन के साथ एंबेडेड स्ट्रक्चर्स को कैसे संभालें?

2024-11-09 को प्रकाशित
ब्राउज़ करें:359

How to Handle Embedded Structs with Custom UnmarshalJSON in Go?

त्रुटि प्रबंधन: एंबेडेड संरचनाओं के लिए कस्टम अनमर्शल

गो में, जब एम्बेडेड फ़ील्ड के साथ एक संरचना में 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