Tôi đang phát triển ứng dụng khách API nơi tôi cần mã hóa tải trọng JSON theo yêu cầu và giải mã phần thân JSON từ phản hồi.
Tôi đã đọc mã nguồn từ một số thư viện và từ những gì tôi đã thấy, về cơ bản tôi có hai khả năng mã hóa và giải mã chuỗi JSON.
Sử dụng json.Unmarshal
chuyển toàn bộ chuỗi phản hồi
data, err := ioutil.ReadAll(resp.Body)
if err == nil && data != nil {
err = json.Unmarshal(data, value)
}
hoặc sử dụng json.NewDecoder.Decode
err = json.NewDecoder(resp.Body).Decode(value)
Trong trường hợp của tôi, khi xử lý các phản hồi HTTP thực hiện io.Reader
, phiên bản thứ hai dường như yêu cầu ít mã hơn, nhưng vì tôi đã thấy cả hai tôi tự hỏi liệu tôi có nên sử dụng giải pháp nào hơn là giải pháp khác không.
Hơn nữa, câu trả lời được chấp nhận từ câu hỏi này nói
Vui lòng sử dụng
json.Decoder
thay vìjson.Unmarshal
.
nhưng nó không đề cập đến lý do. Tôi có nên thực sự tránh sử dụng json.Unmarshal
?
ioutil.ReadAll
là hầu như lúc nào cũng là điều sai trái để làm. Nó không liên quan đến mục tiêu của bạn, nhưng yêu cầu bạn phải có đủ bộ nhớ liền kề để lưu trữ bất cứ thứ gì có thể rơi xuống đường ống, ngay cả khi 20TB phản hồi cuối cùng là sau lần cuối cùng }
trong JSON của bạn.
io.LimitReader
để ngăn chặn điều đó.