Sto sviluppando un client API in cui ho bisogno di codificare un payload JSON su richiesta e decodificare un corpo JSON dalla risposta.
Ho letto il codice sorgente da diverse librerie e da quello che ho visto, ho sostanzialmente due possibilità per codificare e decodificare una stringa JSON.
Utilizzare il json.Unmarshal
passaggio dell'intera stringa di risposta
data, err := ioutil.ReadAll(resp.Body)
if err == nil && data != nil {
err = json.Unmarshal(data, value)
}
o usando json.NewDecoder.Decode
err = json.NewDecoder(resp.Body).Decode(value)
Nel mio caso, quando si tratta di risposte HTTP che implementano io.Reader
, la seconda versione sembra richiedere meno codice, ma dal momento che ho visto entrambi mi chiedo se c'è qualche preferenza se dovrei usare una soluzione piuttosto che l'altra.
Inoltre, dice la risposta accettata da questa domanda
Si prega di utilizzare
json.Decoder
invece dijson.Unmarshal
.
ma non ha menzionato il motivo. Dovrei davvero evitare di usare json.Unmarshal
?
ioutil.ReadAll
è quasi sempre la cosa sbagliata da fare. Non è correlato al tuo obiettivo, ma richiede di disporre di memoria contigua sufficiente per archiviare tutto ciò che potrebbe venire giù dalla pipe, anche se gli ultimi 20 TB di risposta sono successivi all'ultimo }
nel tuo JSON.
io.LimitReader
per impedirlo.