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.Unmarshal
bü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.Decoder
yerine kullanınjson.Unmarshal
.
ama nedenini söylemiyordu. Gerçekten kullanmaktan kaçınmalı mıyım json.Unmarshal
?
ioutil.ReadAll
olduğ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 .