Я розробляю клієнт 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
це майже завжди неправильно , що потрібно робити. Це не пов’язано з вашою метою, але вимагає, щоб у вас було достатньо суцільної пам’яті, щоб зберігати все, що може зійти з труби, навіть якщо останній відповідь 20 ТБ після останнього }
у вашому JSON.
io.LimitReader
для запобігання цьому.