Ben istek üzerine bir JSON yük kodlamak ve yanıt bir JSON gövdeyi çözmek için gereken bir API istemcisi geliştiriyorum.
Birkaç kütüphaneden kaynak kodunu okudum ve gördüklerimden, temelde bir JSON dizesini kodlamak ve kodunu çözmek için iki olasılık var.
Kullan json.Unmarshalbütün yanıt dizesi geçirerek
data, err := ioutil.ReadAll(resp.Body)
if err == nil && data != nil {
err = json.Unmarshal(data, value)
}
veya kullanarak json.NewDecoder.Decode
err = json.NewDecoder(resp.Body).Decode(value)
Benim durumumda, HTTP yanıtları ile uğraşırken io.Reader, ikinci sürüm daha az kod gerektirir gibi görünüyor, ancak her ikisini de gördüm beri ben diğeri yerine bir çözüm kullanmanız gerekir herhangi bir tercih olup olmadığını merak ediyorum.
Üstelik bu soruya gelen kabul cevap diyor
Lütfen
json.Decoderyerine kullanınjson.Unmarshal.
ama nedenini söylemiyordu. Gerçekten kullanmaktan kaçınmalı mıyım json.Unmarshal?
ioutil.ReadAllolduğu hemen hemen her zaman yapmak yanlış şey. Hedefinizle ilgili değildir, ancak son 20 TB yanıt JSON'unuzdaki sonuncudan sonra olsa bile, borudan gelenleri depolamak için yeterli bitişik belleğe sahip olmanızı gerektirir }.
io.LimitReaderönlemek için kullanabilirsiniz .