我正在开发一个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
吗?
这在GitHub拉动请求更换,以解组与json.NewDecoder调用“中JSON解码删除缓冲器”。
—
马特
这取决于哪种输入更方便您使用。blog.golang.org/json-and-go提供了使用这两种技术的示例。
—
rexposadas 2014年
国际海事组织,
—
达斯汀2014年
ioutil.ReadAll
是几乎总是错误的做法。它与您的目标无关,但是要求您有足够的连续内存来存储管道中可能发生的所有事件,即使最后20TB的响应}
位于JSON中的最后一个之后。
@Dustin您可以
—
伊南克·古姆斯
io.LimitReader
用来防止这种情况。