Estou desenvolvendo um cliente de API em que preciso codificar uma carga JSON mediante solicitação e decodificar um corpo JSON da resposta.
Eu li o código fonte de várias bibliotecas e, pelo que vi, tenho basicamente duas possibilidades para codificar e decodificar uma string JSON.
Use json.Unmarshalpassar toda a cadeia de resposta
data, err := ioutil.ReadAll(resp.Body)
if err == nil && data != nil {
err = json.Unmarshal(data, value)
}
ou usando json.NewDecoder.Decode
err = json.NewDecoder(resp.Body).Decode(value)
No meu caso, ao lidar com respostas HTTP implementadas io.Reader, a segunda versão parece exigir menos código, mas desde que eu vi as duas, fico imaginando se há alguma preferência se devo usar uma solução em vez da outra.
Além disso, a resposta aceita desta pergunta diz
Por favor use em
json.Decodervez dejson.Unmarshal.
mas não mencionou o motivo. Devo realmente evitar o uso json.Unmarshal?
ioutil.ReadAllé quase sempre a coisa errada a fazer. Não está relacionado ao seu objetivo, mas exige que você tenha memória contígua suficiente para armazenar o que estiver vindo do canal, mesmo que os últimos 20 TB de resposta sejam os seguintes }no JSON.
io.LimitReaderpara evitar isso.