मैं एक API क्लाइंट विकसित कर रहा हूँ जहाँ मुझे अनुरोध पर JSON पेलोड को एनकोड करना होगा और प्रतिक्रिया से JSON बॉडी को डीकोड करना होगा।
मैंने कई पुस्तकालयों से स्रोत कोड पढ़ा है और जो मैंने देखा है, उसमें मूल रूप से JSON स्ट्रिंग को एन्कोडिंग और डिकोड करने की दो संभावनाएँ हैं।
json.Unmarshal
संपूर्ण प्रतिक्रिया स्ट्रिंग पास करने का उपयोग करें
data, err := ioutil.ReadAll(resp.Body)
if err == nil && data != nil {
err = json.Unmarshal(data, value)
}
या उपयोग कर रहा है json.NewDecoder.Decode
err = json.NewDecoder(resp.Body).Decode(value)
मेरे मामले में, जब लागू होने वाली HTTP प्रतिक्रियाओं से निपटने के लिए io.Reader
, दूसरे संस्करण को कम कोड की आवश्यकता होती है, लेकिन जब से मैंने दोनों को देखा है तो मुझे आश्चर्य होता है कि क्या कोई वरीयता है कि क्या मुझे दूसरे के बजाय एक समाधान का उपयोग करना चाहिए।
इसके अलावा, इस प्रश्न से स्वीकृत उत्तर कहता है
के
json.Decoder
बजाय का उपयोग करेंjson.Unmarshal
।
लेकिन इसका कारण नहीं बताया। क्या मुझे वास्तव में उपयोग करने से बचना चाहिए json.Unmarshal
?
ioutil.ReadAll
है लगभग हमेशा के लिए गलत बात। यह आपके लक्ष्य से संबंधित नहीं है, लेकिन आपको पाइप के नीचे जो भी आ रहा है उसे स्टोर करने के लिए पर्याप्त सन्निहित मेमोरी की आवश्यकता होती है, भले ही प्रतिक्रिया का अंतिम 20TB }
आपके JSON में अंतिम के बाद हो ।
io.LimitReader
रोकने के लिए उपयोग कर सकते हैं ।