@Chakrit एक टिप्पणी में उल्लेख किया है, आप नहीं इस काम के लिए लागू करने से प्राप्त कर सकते हैं json.Marshaler
पर MyStruct
, और हर struct पर एक कस्टम JSON मार्शलिंग समारोह को लागू करने कि का उपयोग करता है यह एक बहुत अधिक काम हो सकता है। यह वास्तव में आपके उपयोग के मामले पर निर्भर करता है कि क्या यह अतिरिक्त काम के लायक है या आप अपने JSON में खाली संरचना के साथ रहने के लिए तैयार हैं या नहीं, लेकिन यहां मैं जिस पैटर्न का उपयोग करता हूं वह है Result
:
type Result struct {
Data MyStruct
Status string
Reason string
}
func (r Result) MarshalJSON() ([]byte, error) {
return json.Marshal(struct {
Data *MyStruct `json:"data,omitempty"`
Status string `json:"status,omitempty"`
Reason string `json:"reason,omitempty"`
}{
Data: &r.Data,
Status: r.Status,
Reason: r.Reason,
})
}
func (r *Result) UnmarshalJSON(b []byte) error {
decoded := new(struct {
Data *MyStruct `json:"data,omitempty"`
Status string `json:"status,omitempty"`
Reason string `json:"reason,omitempty"`
})
err := json.Unmarshal(b, decoded)
if err == nil {
r.Data = decoded.Data
r.Status = decoded.Status
r.Reason = decoded.Reason
}
return err
}
यदि आपके पास कई क्षेत्रों के साथ विशाल संरचनाएं हैं, तो यह थकाऊ हो सकता है, विशेष रूप से बाद में एक संरचना के कार्यान्वयन को बदल सकता है, लेकिन json
आपकी आवश्यकताओं के अनुरूप पूरे पैकेज को फिर से लिखना कम नहीं (एक अच्छा विचार नहीं), यह बहुत ही एकमात्र तरीका है जिसे मैं प्राप्त करने के बारे में सोच सकता हूं ऐसा तब भी किया जाता है जब वह एक नॉन-पॉइंटर MyStruct
को वहां रखता है ।
इसके अलावा, आपको इनलाइन स्ट्रक्चर्स का उपयोग करने की आवश्यकता नहीं है, आप नामित नाम बना सकते हैं। मैं कोड पूरा होने के साथ लाइट का उपयोग करता हूं, इसलिए अव्यवस्था से बचने के लिए मैं इनलाइन पसंद करता हूं।